当前位置: 首页 > 知识库问答 >
问题:

(没有0返回)java.lang.IllegalArgumentExc的:比较方法违反了它的一般合同

黎苑博
2023-03-14

我不确定出了什么问题。我查阅了其他类似的关于堆栈溢出的问题和答案,但不确定我的方法有什么问题。我是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个答案

倪举
2023-03-14

正在发生的是你正在进入

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

带空格。发生这种情况时,输入被视为一个字符串,没有另一个字符串可供比较,这就是为什么您得到IllegalArgumentExc的原因。要修复此代码,请像这样更改main方法中的for循环

for(i=0;i<n;i++){
        arr.add(String.valueOf(new Random().nextInt(17)));
    }
慕容嘉熙
2023-03-14

问题是你的陈述XY.compareTo(YX)

来自文档:

参数:

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

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

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

使用以下代码进行比较:

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

 类似资料:
  • 我正在将我们的项目升级到java 7。我遇到了Collections.sort()的非法参数异常。我知道这个异常的原因是java 7中新的Timsort(我确实抛出了之前在这个问题上提出的所有问题)。现在我需要修改比较逻辑来克服这个异常。这是我的比较方法 > < li> 我尝试覆盖equals()方法,使用与compare相同的逻辑,认为如果equals和compare返回相同的结果,应该可以解决

  • 这种异常的原因是什么: 我使用的比较器如下: 其中 parameter.getSomeValue: 在: 哪里: 我不能重现这个异常,但它有时会出现。此外,您能给出100%出现此问题的代码示例吗?

  • 问题内容: 您好,以下是我的比较器的比较方法。我不确定是什么问题。我在堆栈溢出时查找了其他类似标题的问题和答案,但不确定我的方法有什么问题,但我一直在获取java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 任何帮助将不胜感激 添加我得到的异常 问题答案: 您的方法 不是可 传递的 。如果和,则必须等于。 现在考虑这种情况: 对于,和,假设方法返回以下

  • 使用自定义比较器执行< code > Collection.sort using >时,我得到一个< code > Java . lang . illegalargumentexception:Comparison方法违反了它的一般约定 我理解这是一个问题,因为该方法是不可传递的。在我的比较器中,调用了多个方法,我确定了违反此规则的代码段。然而,我无法修复它,也看不到它的问题。

  • 我看到我的应用程序在一些中国 Android 手机上发生了很多崩溃,并出现错误:比较方法违反了其总合同! 我读过这与Collections.sort有关。 我不太确定的是,这是否是因为我的自定义比较器。 以下是错误发生的地方: 比较器是这样的: 所以我不太确定比较器是否搞砸了什么,或者我是否需要以不同的方式进行collections.sort调用 感谢任何帮助

  • 一切似乎都运行良好(几天),但我只遇到了一次问题,并且很难重现该问题。 “比较方法违反了其总合同!”被抛出,完全让我措手不及。我有以下几点: 我的染色体类别: 我有一个ArrayList,我使用了两个Collections。排序(MyList)和集合。排序(MyList,Collections.reverseOrder())。到目前为止,他们仍在正常工作。我在100次跑步中只遇到过一次错误。这个实