Java 按值大小对映射进行排序
我有一个简单的比较方法,可以根据值的大小对Java 按值大小对映射进行排序,java,sorting,dictionary,collections,compare,Java,Sorting,Dictionary,Collections,Compare,我有一个简单的比较方法,可以根据值的大小对Map进行排序 public List<Entry<String, HashSet<String>>> orderByDescStringSetSize(HashMap<String, HashSet<String>> map){ Set<Entry<String, HashSet<String>>> set = map.entrySet();
Map
进行排序
public List<Entry<String, HashSet<String>>> orderByDescStringSetSize(HashMap<String, HashSet<String>> map){
Set<Entry<String, HashSet<String>>> set = map.entrySet();
List<Entry<String, HashSet<String>>> list = new ArrayList<Entry<String, HashSet<String>>>(set);
Collections.sort(list, new Comparator<Map.Entry<String, HashSet<String>>>(){
public int compare(Map.Entry<String, HashSet<String>> o1, Map.Entry<String, HashSet<String>> o2){
Integer o1Vals = o1.getValue().size();
Integer o2Vals = o2.getValue().size();
//descending
if(o2Vals > o1Vals)
return 1;
else if(o2Vals==o1Vals)
return 0;
else
return -1;
}
});
return list;
}
公共列表orderByDescStringSetSize(HashMap映射){
Set=map.entrySet();
列表=新的ArrayList(集合);
Collections.sort(list,newcomparator(){
公共整数比较(Map.Entry o1,Map.Entry o2){
整数O1VAL=o1.getValue().size();
整数O2VAL=o2.getValue().size();
//下降的
如果(O2VAL>O1VAL)
返回1;
否则如果(O2VAL==O1VAL)
返回0;
其他的
返回-1;
}
});
退货清单;
}
我得到
java.lang.IllegalArgumentException:比较方法违反了它的一般约定
!为什么会这样?这是因为O2VAL==O1VAL
并没有达到您的预期
您正在使用整数
对象-请使用等于
这可能不是唯一的问题。这是因为
O2VAL==O1VAL
没有达到您期望的效果
您正在使用整数
对象-请使用等于
这可能不是唯一的问题。使用与您相同的方法,我将修改:
的大小是一个hashset
,用于比较,而不是int
整数
- 如果返回值,则无需添加
。此外,您可以只返回减法后的值:if-else if-else
李>returno2vals-o1Vals
- 您在某些点和地图中使用了
。Entry,您确定导入正确吗?在任何情况下,我建议您始终使用其中一种,以确保类型相同李>Entry
public List<Entry<String, HashSet<String>>> orderByDescStringSetSize2(HashMap<String, HashSet<String>> map) {
Set<Entry<String, HashSet<String>>> set = map.entrySet();
List<Entry<String, HashSet<String>>> list = new ArrayList<>(set);
Collections.sort(list, new Comparator<Entry<String, HashSet<String>>>() {
@Override
public int compare(Entry<String, HashSet<String>> o1, Entry<String, HashSet<String>> o2) {
int o1Vals = o1.getValue().size();
int o2Vals = o2.getValue().size();
// Descending
return o2Vals - o1Vals;
}
});
return list;
}
使用与您相同的方法,我将修改:
的大小是一个hashset
,用于比较,而不是int
整数
- 如果返回值,则无需添加
。此外,您可以只返回减法后的值:if-else if-else
李>returno2vals-o1Vals
- 您在某些点和地图中使用了
。Entry,您确定导入正确吗?在任何情况下,我建议您始终使用其中一种,以确保类型相同李>Entry
public List<Entry<String, HashSet<String>>> orderByDescStringSetSize2(HashMap<String, HashSet<String>> map) {
Set<Entry<String, HashSet<String>>> set = map.entrySet();
List<Entry<String, HashSet<String>>> list = new ArrayList<>(set);
Collections.sort(list, new Comparator<Entry<String, HashSet<String>>>() {
@Override
public int compare(Entry<String, HashSet<String>> o1, Entry<String, HashSet<String>> o2) {
int o1Vals = o1.getValue().size();
int o2Vals = o2.getValue().size();
// Descending
return o2Vals - o1Vals;
}
});
return list;
}
可能重复的添加导致引发异常的映射示例。重复上为“是”。我建议使用
返回o2Vals-o1Vals代码>你应该很好。非常感谢你们所有人!很抱歉,我进行了复制。可能的复制添加导致引发异常的映射示例。复制上的是。我建议使用返回o2Vals-o1Vals代码>你应该很好。非常感谢你们所有人!很抱歉我复制了。非常感谢!!我没有想到这一点,或者更好,在这里使用int
,因为当size()
返回int
时,没有理由使用Integer
。或者将整个方法简化为返回整数.compare(o1.getValue().size(),o2.getValue().size())代码>非常感谢!!我没有想到这一点,或者更好,在这里使用int
,因为当size()
返回int
时,没有理由使用Integer
。或者将整个方法简化为返回整数.compare(o1.getValue().size(),o2.getValue().size())代码>