(нет возврата 0) java .lang.IllegalArgumentException: метод сравнения нарушает его общий договор - PullRequest
0 голосов
/ 21 июня 2020

Я не уверен, что не так. Я просмотрел другие похожие вопросы и ответы о переполнении стека, но не уверен, что не так с моим методом. Я новичок в java, поэтому любая помощь будет большой. Спасибо.

Мой код:

 import java.util.*; 
  
class LargestNumber {     
    static void printLargest(Vector<String> arr){ 
      
        Collections.sort(arr, new Comparator<String>(){ 
        @Override
        public int compare(String X, String Y) {  
        String XY=X + Y; 
        String YX=Y + X; 
        return XY.compareTo(YX) > 0 ? -1:1; 
    } 
}); 
          
    Iterator it = arr.iterator(); 
  
    while(it.hasNext()) 
        System.out.print(it.next()); 
      
    } 
      
    public static void main (String[] args) { 
Scanner s=new Scanner(System.in);
          int i,n;
          n=s.nextInt(); 
        Vector<String> arr; 
        arr = new Vector<>(); 
        for(i=0;i<n;i++){  
        arr.add(s.next());
} 
        
        printLargest(arr); 
    } 
} 

ошибка:

100
2 8 2 3 6 4 1 1 10 6 3 3 6 1 3 8 4 6 1 10 8 4 10 4 1 3 2 3 2 6 1 5 2 9 8 5 10 8 7 9 6 4 2 6 3 8 8 9 8 2 9 10 3 10 7 5 7 1 7 5 1 4 7 6 1 10 5 4 8 4 2 7 8 1 1 7 4 1 1 9 8 6 5 9 9 3 7 6 3 10 8 10 7 2 5 1 1 9 9 5

Your output:

Your stderr:
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
    at java.util.TimSort.mergeLo(TimSort.java:777)
    at java.util.TimSort.mergeAt(TimSort.java:514)
    at java.util.TimSort.mergeCollapse(TimSort.java:441)
    at java.util.TimSort.sort(TimSort.java:245)
    at java.util.Arrays.sort(Arrays.java:1512)
    at java.util.Vector.sort(Vector.java:1345)
    at java.util.Collections.sort(Collections.java:177)
    at LargestNumber.printLargest(LargestNumber.java:6)
    at LargestNumber.main(LargestNumber.java:32)

Correct output:
9999999998888888888887777777776666666666555555554444444443333333333222222222111111111111111101010101010101010
 (Time used: 0.12/1.50, memory used: 23568384/536870912.)`enter code here`

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Проблема в том, что ваш оператор XY.compareTo(YX) > 0 ? -1:1 не возвращает 0, когда две переменные равны, что составляет IllegalArgumentException: Comparison method violates its general contract!

From do c:

Параметры:

o1 - первый объект для сравнения.

o2 - второй сравниваемый объект.

Возвращает: отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равен или больше второго.

Используйте следующий код для сравнения:

arr.sort((X, Y) -> {
    String XY = X + Y;
    String YX = Y + X;
    return XY.compareTo(YX);
});
0 голосов
/ 21 июня 2020

Вы вводите

2 8 2 3 6 4 1 1 10 6 3 3 6 1 3 8 4 6 1 10 8 4 10 4 1 3 2 3 2 6 1 5 2 9 8 5 10 8 7 9 6 4 2 6 3 8 8 9 8 2 9 10 3 10 7 5 7 1 7 5 1 4 7 6 1 10 5 4 8 4 2 7 8 1 1 7 4 1 1 9 8 6 5 9 9 3 7 6 3 10 8 10 7 2 5 1 1 9 9 5

с пробелами. Когда это происходит, ввод обрабатывается как одна строка без другой строки для сравнения, поэтому вы получили IllegalArgumentException. Чтобы исправить этот код, измените свой на l oop в основном методе следующим образом ...

for(i=0;i<n;i++){
        arr.add(String.valueOf(new Random().nextInt(17)));
    }
...