【问题标题】:java.lang.IllegalArgumentException: Comparison method violates its general contract, java.base/java.util.TimSort.mergeCollapsejava.lang.IllegalArgumentException:比较方法违反了它的一般约定,java.base/java.util.TimSort.mergeCollapse
【发布时间】:2021-07-08 20:12:51
【问题描述】:
class Solution {
    public int[] frequencySort(int[] nums) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i : nums) {
            list.add(i);
        }
        list = fun(list);
        for(int i=0;i<nums.length;i++){
            nums[i] = list.get(i);
        }
        return nums;
    }
    
    public ArrayList<Integer> fun(ArrayList<Integer> list){
        Map<Integer,Integer> map = new HashMap<>();
        
        list.forEach(i -> {
            map.put(i,map.getOrDefault(i,0)+1);
        });
        
        Collections.sort(list,(n1,n2) -> {
            int freq1 = map.get(n1);
            int freq2 = map.get(n2);
            
            if(freq1!=freq2){
                return freq1-freq2;
                // if(freq1>freq2){
                //     return 1;
                // }
                // return -1;
            }
            return n2-n1;
            //if(n1>=n2){
            //   return -1;
            //}
           // return 1;
            
        } );
        return list;
    }
}

//sample input : nums = [2,3,1,3,2]
//output : [1,3,3,2,2]

在有趣的方法中,在 Collections.sort() 中,我根据频率的递增顺序对数组进行排序,如果两者具有相同的频率,则我以值的递增顺序添加它们。上面的代码工作正常,我从 google 获得,但我自己编写了几乎类似的代码,我将其包含为 cmets。两个代码看起来相似,但我的代码(作为 cmets)只通过了 85/150 个测试用例,之后我得到“java.lang.IllegalArgumentException:比较方法违反其一般合同!”

我发现了类似的问题,但我看不懂,谁用更简单的术语解释一下!!!

//This block I found in google

if(freq1!=freq2){
    return freq1-freq2;
 }
 return n2-n1;
//Below Block gives "Comparison method violates its general contract"

if(freq1!=freq2){
       if(freq1>freq2){
          return 1;
        }
       return -1;
}
if(n1>=n2){
       return -1;
}
return 1;

【问题讨论】:

    标签: java sorting exception


    【解决方案1】:

    您作为合同违约示例给出的最后一个区块是错误的,原因如下。

    例如,如果我们有两个元素 a = (5, 1)b = (5, 1),其中我将每个元素表示为 (freq, n) 的元组,那么比较 ab 将返回 -1 指定 @987654327 @ 必须早于排序列表中的 b。但是,如果我们以相反的顺序比较这两个值 - ba,给定的示例仍将返回 -1,这一次表示 b 必须早于 a

    我相信在freqn 相等的情况下明确返回0 应该修复最后一段代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多