Java树集:“;无法解析构造函数“;比较器

Java树集:“;无法解析构造函数“;比较器,java,constructor,integer,comparator,treeset,Java,Constructor,Integer,Comparator,Treeset,由于某些原因,我的树集不接受我的比较器。请帮忙 树集类: public class PQTreeQueue<Integer> extends AbstractQueue<Integer>{ private TreeSet<Integer> _pqTree; public PQTreeQueue() { noZeroComparator noZero = new noZeroComparator(); _pqTree = new TreeSe

由于某些原因,我的树集不接受我的比较器。请帮忙

树集类:

public class PQTreeQueue<Integer> extends AbstractQueue<Integer>{

private TreeSet<Integer> _pqTree;

public PQTreeQueue() {
    noZeroComparator noZero = new noZeroComparator();
    _pqTree = new TreeSet<Integer>(noZero);
}
公共类PQTreeQueue扩展了抽象队列{
私有树集;
公共PQTreeQueue(){
noZeroComparator noZero=新的noZeroComparator();
_pqTree=新树集(无零);
}
比较器类(在另一个文件中定义)

公共类noZeroComparator实现Comparator{
@凌驾
公共整数比较(整数e0,整数e1){
如果(e0.与(e1)相比>=0){
返回-1;
}否则{
返回1;
}
}

您定义了
TreeSet
,泛型参数为整数。您指定的
TreeSet
构造函数需要
比较器,其泛型参数为整数的超类型或整数本身。
该建造商的定义:

TreeSet<E>(comparator<? super E>);

错误在这一行:

public class PQTreeQueue<Integer> extends AbstractQueue<Integer>
一切都应该工作。(除了从不返回0的比较器不工作的事实之外。如果调用
compare(x,x)
,会发生什么?它会说
x>x
?)


关于比较器要求的更多信息:数学规则是比较器强制总排序,这意味着函数必须遵守总排序规则(包括传递性)。根据“实现者必须确保
sgn(compare(x,y))==-sgn(compare(y,x))
适用于所有x和y。”这特别意味着,
sgn(compare(x,x))==-sgn(compare(x,x))
,并且只有当
compare(x,x)==0
时才可能。这证明了从不返回0的比较器违反了规则,因为当两个参数都是
=
时,
compare
必须返回0。[对于不是
==
但根据
.equals()相等的参数,该规则较弱。)
;javadoc没有说您不能这样做,但它确实说这可能会导致排序集和映射等行为异常。请参见

旁注:从不返回0的比较器不是有效的比较器。我不知道您试图通过编写从不返回0的比较器来实现什么,但这会导致问题。我添加在我的答案中添加了一个注释,解释了为什么这不是一个有效的比较器。为什么?用户想要进行自定义比较,他/她不想返回0,只是-1或1。您的代码可以实现这一点吗?1)您错误地诊断了问题。使用
比较器
没有什么错,其中
比较器向我的答案添加了信息,解释了为什么它是无效的编写只返回-1或1的比较器是错误的。向PQTreeQueue提供错误的类型参数是可以接受的。我的回答并没有说他不应该使用比较器,我在回答中提到:“泛型参数是整数的超级类型或整数本身”。但是用户可能需要对他/她的{PQTreeQueue}进行一些自定义比较如果他/她不想返回0(可能他/她不想在树中包含相等的项,如果比较器返回0,则不会包含这些项),在这种情况下,他/她不能依赖:标准整数比较方法应该做什么。类型参数为“已接受”,但它不正确。该参数隐藏相同名称的类型。在您的示例中,
PQTreeQueue
导致另一个
myinteger
被隐藏,因此它不能在您的类中使用。在您的类中使用
myinteger
并不是指您上面声明的类型。这显然不是您的意图。
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);
}
public class PQTreeQueue<Integer> extends AbstractQueue<Integer>
public class ArrayList<E> ...
public class PQTreeQueue extends AbstractQueue<Integer>