提问者:小点点

线程“main”java.lang.IllegalArgumentException中的异常:比较方法违反了它的一般契约! 如何化解?


我不确定出了什么问题。 我查阅了其他类似标题的问题和答案堆栈溢出,但不确定我的方法有什么问题。我是一个初学者在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 8 2 3 6 4 1 1 10 6 3 3 6 1 1 1 1 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

带空格。 当发生这种情况时,输入将被视为一个没有另一个字符串可供比较的字符串,这就是为什么您得到了IllegalArgumentException。 要修复此代码,请在main方法中更改for循环,如下所示。。。

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

匿名用户

问题是您的语句xy.compareto(YX)>; 0? -1:1两个变量相等时不返回0,这是IllegalArgumentException:比较方法违反了它的一般约定!

来自Doc:

参数:

O1-要比较的第一个对象。

o2-要比较的第二个对象。

返回:当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。

使用以下代码进行比较:

    arr.sort((X, Y) -> {
        String XY = X + Y;
        String YX = Y + X;
        return XY.compareTo(YX);
    });