由于某些原因,我的比较器未被我的树集接受。请帮忙吗?
Treeset类:
public class PQTreeQueue<Integer> extends AbstractQueue<Integer>{
private TreeSet<Integer> _pqTree;
public PQTreeQueue() {
noZeroComparator noZero = new noZeroComparator();
_pqTree = new TreeSet<Integer>(noZero);
}
比较器类(在另一个文件中定义)
public class noZeroComparator implements Comparator<Integer> {
@Override
public int compare(Integer e0, Integer e1) {
if (e0.compareTo(e1) >= 0) {
return -1;
} else {
return 1;
}
}
答案 0 :(得分:0)
您使用泛型参数将TreeSet
定义为整数。您指定的TreeSet
构造函数需要comparator
,其泛型参数是Integer或Integer本身的超类型。
该构造函数的定义: -
TreeSet<E>(comparator<? super E>);
最好不要将Integer作为通用参数传递给TreeSet
。创建自己的类,如Integer
,然后使用泛型参数创建comparator
作为您自己的comparator
类,并将相同的类作为自定义整数类的泛型参数。
public class MyInterger {
int value = 0;
public int compareTo(MyInterger anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
}
public class noZeroComparator implements Comparator<MyInterger> {
@Override
public int compare(MyInterger e0, MyInterger e1) {
if (e0.compareTo(e1) >= 0) {
return -1;
} else {
return 1;
}
}
}
public class PQTreeQueue<MyInterger> extends AbstractQueue<MyInterger>{
private TreeSet<MyInterger> _pqTree;
public PQTreeQueue() {
noZeroComparator noZero = new noZeroComparator();
_pqTree = new TreeSet<MyInterger>(noZero);
}
答案 1 :(得分:0)
错误在这一行:
public class PQTreeQueue<Integer> extends AbstractQueue<Integer>
这(第一部分)是声明泛型类的语法。声明泛型类时,尖括号中的标识符是类型参数。它就像Java中的声明
public class ArrayList<E> ...
除了您调用类型参数Integer
而不是E
。编译器以与Integer
相同的方式处理E
- 它成为可以用任何实际类型替换的类型参数,以及名称Integer
用于的事实Java中的其他东西是没有意义的。泛型类型与Integer
失去所有连接。在本课程的其他任何地方,Integer
都会引用类型变量,而不是实际的java.lang.Integer
。
如果您删除<Integer>
:
public class PQTreeQueue extends AbstractQueue<Integer>
一切都应该有效。 (除了从不返回0的比较器不起作用的事实。如果你打电话给compare(x, x)
会怎么样?是否会说x > x
?)
关于比较器要求的 MORE 信息:数学规则是比较器强加总排序,这意味着该函数必须遵守总排序规则(包括传递性)。根据{{3}},“实施者必须确保所有x和y都sgn(compare(x, y)) == -sgn(compare(y, x))
。”这尤其意味着sgn(compare(x,x)) == -sgn(compare(x,x))
,这仅在compare(x,x) == 0
时才有可能。这证明了永不返回0的比较器违反了规则,因为compare
必须在两个参数都为==
时返回0。 [关于不是==
但根据.equals()
相等的参数,规则较弱; javadoc并没有说你不能这样做,但它确实说它可能导致像排序集和地图这样的事情表现得很奇怪。见the javadoc for compare()