Java Treeset:"无法解析构造函数"比较者

时间:2016-12-06 05:42:40

标签: java constructor integer comparator treeset

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

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;
    }
}

2 个答案:

答案 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()