【发布时间】: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;
【问题讨论】: