我现在在尝试使用通用数据类型对二进制搜索树建模时遇到问题。我最终将读取字符串值并将其插入到二叉树中,因此在Nodez类中声明了字符串。 Nodez类是我定义的一个类,用于声明要传递给搜索树的节点。字符串值将是此类的一个属性。 BSTree基于定义如下的类:
public class BSTree<E extends Comparable<E>> implements BSTreeAPI<E>
我的问题在于代码的主要块。当我尝试插入Nodez类的实例时发生错误。这里的确切错误指出:“不兼容的类型:Nodez无法转换为Comparable”
我花了很多时间尝试调试它,但是我对泛型不是很满意吗?
有什么建议吗?谢谢!
package twotreesanalyzer;
import java.io.IOException;
import java.io.PrintStream;
import java.util.function.Function;
public class TwoTreesAnalyzer
{
public static class Nodez <E extends Comparable<E>> {
public String x;
public E node;
public String get(){
return x;
}
}
public static void main(String[] args) throws AVLTreeException, BSTreeException, IOException
{
Function<String, PrintStream> printUpperCase = x -> System.out.printf("%S", x);
BSTree bstTest = new BSTree();
Nodez e1 = new Nodez();
e1.x = "fresh";
bstTest.insert(e1);
System.out.println(bstTest.inTree(e1.get()));
}
}
最佳答案
现在,您的BSTree试图比较您的nodez对象,如果这是您希望其运行的方式,则需要在Nodez类上实现Comparible。我以收集树为例快速修复了它。
public static class Nodez <E extends Comparable<E>> implements Comparable<Nodez<E>>{
public String x;
public E node;
public String get(){
return x;
}
@Override
public int compareTo(Nodez<E> node) {
return node.x.compareTo(x);
}
}
public static void main(String[] args) throws IOException
{
Function<String, PrintStream> printUpperCase = x -> System.out.printf("%S", x);
TreeSet<Nodez<String>> bstTest = new TreeSet<>();
Nodez<String> e1 = new Nodez<>();
e1.x = "fresh";
bstTest.add(e1);
System.out.println(bstTest.contains(e1));
}
但是,我认为您希望节点能够接受任何可比较的通用类型,在这种情况下,应将其排序如下:
public static class Nodez <E extends Comparable<E>> implements Comparable<Nodez<E>>{
public E x;
public Nodez<E> node;
public E get(){
return x;
}
@Override
public int compareTo(Nodez<E> node) {
return node.x.compareTo(x);
}
}
public static void main(String[] args) throws IOException
{
Function<String, PrintStream> printUpperCase = x -> System.out.printf("%S", x);
TreeSet<Nodez<String>> bstTest = new TreeSet<>();
Nodez<String> e1 = new Nodez<>();
e1.x = "fresh";
bstTest.add(e1);
System.out.println(bstTest.contains(e1));
}