【问题标题】:Java 8 stream map to list of keys sorted by valuesJava 8 流映射到按值排序的键列表
【发布时间】:2015-08-06 04:42:51
【问题描述】:

我有映射 Map<Type, Long> countByType 并且我想要一个列表,该列表按其对应的值对键进行排序(从最小值到最大值)。我的尝试是:

countByType.entrySet().stream().sorted().collect(Collectors.toList());

但是这只是给了我一个条目列表,我怎样才能得到一个类型列表,而不会丢失顺序?

【问题讨论】:

    标签: java collections lambda java-8 java-stream


    【解决方案1】:
    Map<Integer, String> map = new HashMap<>();
    map.put(1, "B");
    map.put(2, "C");
    map.put(3, "D");
    map.put(4, "A");
    
    List<String> list = map.values()
                           .stream()
                           .sorted()
                           .collect(Collectors.toList());
    

    输出:[A, B, C, D]

    【讨论】:

      【解决方案2】:

      你可以用这个作为你的问题的例子

          Map<Integer, String> map = new HashMap<>();
          map.put(10, "apple");
          map.put(20, "orange");
          map.put(30, "banana");
          map.put(40, "watermelon");
          map.put(50, "dragonfruit");
      
          // split a map into 2 List
          List<Integer> resultSortedKey = new ArrayList<>();
          List<String> resultValues = map.entrySet().stream()
                  //sort a Map by key and stored in resultSortedKey
                  .sorted(Map.Entry.<Integer, String>comparingByKey().reversed())
                  .peek(e -> resultSortedKey.add(e.getKey()))
                  .map(x -> x.getValue())
                  // filter banana and return it to resultValues
                  .filter(x -> !"banana".equalsIgnoreCase(x))
                  .collect(Collectors.toList());
      
          resultSortedKey.forEach(System.out::println);
          resultValues.forEach(System.out::println);
      

      【讨论】:

        【解决方案3】:

        这是StreamEx的简单解决方案

        EntryStream.of(countByType).sortedBy(e -> e.getValue()).keys().toList();
        

        【讨论】:

          【解决方案4】:

          您必须根据条目的值使用自定义比较器进行排序。然后在收集之前选择所有键

          countByType.entrySet()
                     .stream()
                     .sorted((e1, e2) -> e1.getValue().compareTo(e2.getValue())) // custom Comparator
                     .map(e -> e.getKey())
                     .collect(Collectors.toList());
          

          【讨论】:

            【解决方案5】:

            您可以按如下方式对地图进行排序,更多示例here

            //Sort a Map by their Value.
            Map<Integer, String> random = new HashMap<Integer, String>();
            
            random.put(1,"z");
            random.put(6,"k");
            random.put(5,"a");
            random.put(3,"f");
            random.put(9,"c");
            
            Map<Integer, String> sortedMap =
                    random.entrySet().stream()
                            .sorted(Map.Entry.comparingByValue())
                            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                                    (e1, e2) -> e2, LinkedHashMap::new));
            System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray()));
            

            【讨论】:

            • 这个 (e1, e2) -> e2 是做什么的?
            【解决方案6】:

            你说你想按值排序,但你的代码中没有。将 lambda(或方法引用)传递给 sorted,告诉它你想如何排序。

            你想拿到钥匙;使用map 将条目转换为键。

            List<Type> types = countByType.entrySet().stream()
                    .sorted(Comparator.comparing(Map.Entry::getValue))
                    .map(Map.Entry::getKey)
                    .collect(Collectors.toList());
            

            【讨论】:

            • ... 或 .sorted(Map.Entry.comparingByValue())
            • 链接sorted 后如何将流返回到地图?从技术上讲,我知道我无法将其还原为地图,因为它的集合没有排序。但我想像这样.forEach((k,v) -&gt; System.out.println(k + ": " + v) 打印地图。如何使用该流实现这一目标?
            • @dabadaba 在.sorted(...) 之后你有一个条目流,所以你可以附加.forEach(e -&gt; System.out.println(e.getKey() + ": " + e.getValue()));
            • @dabadaba 你可以使用.reversed() 但由于类型推断的限制你需要指定类型参数:.sorted(Map.Entry.&lt;Type, Long&gt;comparingByValue().reversed())
            • @Jesper 我实际上是这样想的:.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
            猜你喜欢
            • 2019-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-15
            • 2015-12-27
            • 2021-12-23
            • 2017-11-15
            • 2015-02-11
            相关资源
            最近更新 更多