2013-05-06 5 views
1
Collections.sort(cells, new Comparator<MyCell>() { 

     @Override 
     public int compare(MyCell o1, MyCell o2) { 
      if (o1.getX() <= o2.getX() && o1.getY() <= o2.getY()) { 
       return -1; 
      } else { 
       return 1; 
      } 
     } 

    }); 

Здесь полные трассировки стеки:Метод сравнения нарушает его генподряд, с длинным сравнительной

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract! 
at java.util.TimSort.mergeHi(Unknown Source) 
at java.util.TimSort.mergeAt(Unknown Source) 
at java.util.TimSort.mergeCollapse(Unknown Source) 
at java.util.TimSort.sort(Unknown Source) 
at java.util.TimSort.sort(Unknown Source) 
at java.util.Arrays.sort(Unknown Source) 
at java.util.Collections.sort(Unknown Source) 

Я знаю, что есть много вопросов, как это одно, но я не понимаю, почему мой Comparision неправильно , getX() и getY() возвращает long. Итак, как я могу это исправить?

Я уже искал его, но не получил ответа.

Заранее спасибо.

ответ

0

Это хорошая answer по теме. Компаратор должен быть транзитивным для работы. В противном случае вы не получите одинаковые результаты из разных порядков исходных элементов.

+0

Я уже нашел этот ответ, но я не понимаю, как изменить код emy, чтобы он работал? – Sarajog

+0

Это зависит от того, что делают X и Y. Вы не можете изменить код поверхностно, чтобы выполнить эту работу. Вам придется реализовать другой метод сравнения. Проблема состоит в том, что если A имеет X, Y 2,3 и B имеет 1,5, этот метод скажет мне, что A, B, что A больше B, но для B, A, B больше A. Там это не согласованность! Подумайте о том, как обрабатывать случаи X1> X2, но Y1 <= Y2 или наоборот, возвращая 0. – isaach1000

+0

Хорошо, спасибо, я просто понял, что мне нужно проверить что-то еще, потому что это не даст результат, который я хотел. – Sarajog