2016-12-06 27 views
-1

По какой-то причине мой компаратор не принимается моим деревом. Помоги пожалуйста?Java Treeset: «Can not Resolve Constructor» для компаратора

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

Сторона примечания: компаратор, который никогда не возвращает 0, не является допустимым компаратором. Я не знаю, чего вы пытаетесь сделать, написав компаратор, который никогда не возвращает 0, но это вызовет проблемы. – ajb

+0

Я добавил примечание к моему ответу, объяснив, почему это не является допустимым компаратором. – ajb

ответ

0

Вы определили TreeSet с общим параметром в виде целого числа. Требуемый конструктор TreeSetcomparator, общий параметр которого является либо супер-типом 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); 
} 
+0

Не правильный ответ. – ajb

+0

Почему так? Пользователь хочет иметь пользовательское сравнение, он/она не хочет возвращать 0, всего -1 или 1. Может ли ваш код достичь этого? – vvtx

+0

путём голосования без заботы, чтобы объяснить? Не круто. – vvtx

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 информации о требованиях к компараторам: Математический правила заключаются в том, что компаратор налагает полное упорядочение, что означает, что функция должна подчиняться правилам для общего упорядочения (включая транзитивность). Согласно the javadoc for compare(), «Разработчик должен обеспечить, чтобы 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 не говорит, что вы не должны этого делать, но он говорит, что это может привести к тому, что вещи, подобные сортированным наборам и картам, будут вести себя странно.См. http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html.]

 Смежные вопросы

  • Нет связанных вопросов^_^