Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对map类型的映射中的值进行排序<;字符串,列表<;字符串>&燃气轮机;_Java_List_Collections_Hashmap - Fatal编程技术网

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()));
    }