Java 对map类型的映射中的值进行排序<;字符串,列表<;字符串>&燃气轮机;
我有一张这种类型的地图Java 对map类型的映射中的值进行排序<;字符串,列表<;字符串>&燃气轮机;,java,list,collections,hashmap,Java,List,Collections,Hashmap,我有一张这种类型的地图 Map 我想对每个列表中的元素进行排序。无需对地图进行排序,但需要对地图的每个列表进行排序,即对值进行独立排序。希望我清楚 我尝试在映射上使用keySet和entrySet元素,但出现以下错误: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at java.util.ComparableTimSort.binarySort(ComparableTimSort.java:2
Map
我想对每个列表中的元素进行排序。无需对地图进行排序,但需要对地图的每个列表进行排序,即对值进行独立排序。希望我清楚
我尝试在映射上使用keySet和entrySet元素,但出现以下错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.util.ComparableTimSort.binarySort(ComparableTimSort.java:232)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:176)
at java.util.ComparableTimSort.sort(ComparableTimSort.java:146)
at java.util.Arrays.sort(Arrays.java:472)
at java.util.Collections.sort(Collections.java:155)
看起来我正在尝试排序的列表中有null
有什么方法可以对包含null的列表进行排序吗?您可以像这样迭代
映射的键集:
Map<String, List<String>> map;
for(String s : map.keySet()){
Collections.sort(map.get(s));
}
Map;
对于(字符串s:map.keySet()){
Collections.sort(map.get(s));
}
迭代映射值并排序
for(List<String> e : map.values()){
Collections.sort(e);
}
for(列表e:map.values()){
收集.分类(e);
}
假设您的地图是这样的:
Map<String, List<String>> map = new HashMap<String, List<String>>();
map = putMyStuffInTheMap();
Map Map=newhashmap();
map=putMyStuffInTheMap();
您应该迭代要排序的列表并仅对其排序:
Collection<List<String>> listsFromTheMap = map.values();
for (List<String> listFromTheMap : listsFromTheMap) {
Collections.sort(listFromTheMap);
}
集合列表fromthemap=map.values();
对于(从地图列出列表:从地图列出列表){
Collections.sort(listFromTheMap);
}
就这样。希望有帮助。因为您想要排序的列表可以包含null
,并且您不能在null
上调用compareTo
(因为它没有任何方法或字段),所以您需要提供自己的比较器来处理null
,并将其与排序方法一起使用
例如,如果您想将null
放在升序的末尾,则需要实现如下规则:
null
null
-不交换,没有点(返回0)
null
“someString”
-交换,null更大,应该放在“someString”
之后(返回1)
“someString”
null
-不要交换,第一个参数(“someString”
)小于null
(返回-1)“string1”
“string2”
-返回比较两个非空值的默认结果Comparator<String> myComparator = new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
if (s1==null && s2==null) return 0;//swapping has no point here
if (s1==null) return 1;
if (s2==null) return -1;
return s1.compareTo(s2);
}
};
但是,没有什么可以阻止您使用其他比较器而不是
comparator.naturalOrder()
,比如存储在String.CASE不区分大小写\u顺序中的比较器。
现在也可以使用String::compareTognoreCase
方法引用创建该比较器。不清楚。对所有列表中的所有元素进行排序,并将结果添加到新列表中?对每个列表进行独立排序?尽管它是正确的,但根据,我会使用entrySet
而不是keySet
。
for (List<String> list : yourMap.values()) {
Collections.sort(list, myComparator);
}
for (List<String> list : yourMap.values()) {
list.sort(Comparator.nullsLast(Comparator.naturalOrder()));
}