当前位置:   article > 正文

Java——JDK8 新特性-Map对key和value分别排序实现_map按key排序 jdk8

map按key排序 jdk8

摘要

在Java 8 中使用Stream 例子对一个 Map 进行按照keys或者values排序。

一、快速入门

在java 8中按照此步骤对map进行排序.

  1. 将 Map 转换为 Stream
  2. 对其进行排序
  3. Collect and return a new LinkedHashMap (保持顺序)
  1. Map result = map.entrySet().stream()
  2. .sorted(Map.Entry.comparingByKey())
  3. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
  4. (oldValue, newValue) -> oldValue, LinkedHashMap::new));

默认情况下, Collectors.toMap 将返回一个 HashMap。在这里通过使用toMap方法的另一个变体来处理重复问题,它允许我们指定一个合并方法((oldValue, newValue) -> oldValue)。这个合并方法允许用户他们指定想如何处理多个值关联到同一个键的冲突。在下面展示的代码中,我们只是使用了新的值,当然你也可以编写一个智能的算法来处理冲突。

  1. private static Map<String, Task> taskMap_duplicates(List<Task> tasks) {
  2. return tasks.stream().collect(toMap(Task::getTitle, identity(), (t1, t2) -> t2));
  3. }

你可以通过使用toMap方法的第三个变体来指定其他的映射实现。这需要你指定将用来存储结果的Map和Supplier。

  1. public Map<String, Task> collectToMap(List<Task> tasks) {
  2. return tasks.stream().collect(toMap(Task::getTitle, identity(), (t1, t2) -> t2, LinkedHashMap::new));
  3. }

二、按照key排序

  1. public class SortByKeyExample {
  2. public static void main(String[] argv) {
  3. Map<String, Integer> unsortMap = new HashMap<>();
  4. unsortMap.put("z", 10);
  5. unsortMap.put("b", 5);
  6. unsortMap.put("a", 6);
  7. unsortMap.put("c", 20);
  8. unsortMap.put("d", 1);
  9. unsortMap.put("e", 7);
  10. unsortMap.put("y", 8);
  11. unsortMap.put("n", 99);
  12. unsortMap.put("g", 50);
  13. unsortMap.put("m", 2);
  14. unsortMap.put("f", 9);
  15. System.out.println("Original...");
  16. System.out.println(unsortMap);
  17. // sort by keys, a,b,c..., and return a new LinkedHashMap
  18. // toMap() will returns HashMap by default, we need LinkedHashMap to keep the order.
  19. Map<String, Integer> result = unsortMap.entrySet().stream()
  20. .sorted(Map.Entry.comparingByKey())
  21. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
  22. (oldValue, newValue) -> oldValue, LinkedHashMap::new));
  23. // Not Recommend, but it works.
  24. // Alternative way to sort a Map by keys, and put it into the "result" map
  25. Map<String, Integer> result2 = new LinkedHashMap<>();
  26. unsortMap.entrySet().stream()
  27. .sorted(Map.Entry.comparingByKey())
  28. .forEachOrdered(x -> result2.put(x.getKey(), x.getValue()));
  29. System.out.println("Sorted...");
  30. System.out.println(result);
  31. System.out.println(result2);
  32. }
  33. }

三、按照value排序

  1. public class SortByValueExample {
  2. public static void main(String[] argv) {
  3. Map<String, Integer> unsortMap = new HashMap<>();
  4. unsortMap.put("z", 10);
  5. unsortMap.put("b", 5);
  6. unsortMap.put("a", 6);
  7. unsortMap.put("c", 20);
  8. unsortMap.put("d", 1);
  9. unsortMap.put("e", 7);
  10. unsortMap.put("y", 8);
  11. unsortMap.put("n", 99);
  12. unsortMap.put("g", 50);
  13. unsortMap.put("m", 2);
  14. unsortMap.put("f", 9);
  15. System.out.println("Original...");
  16. System.out.println(unsortMap);
  17. // sort by values, and reserve it, 10,9,8,7,6...
  18. Map<String, Integer> result = unsortMap.entrySet().stream()
  19. .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
  20. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
  21. (oldValue, newValue) -> oldValue, LinkedHashMap::new));
  22. // Alternative way
  23. Map<String, Integer> result2 = new LinkedHashMap<>();
  24. unsortMap.entrySet().stream()
  25. .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
  26. .forEachOrdered(x -> result2.put(x.getKey(), x.getValue()));
  27. System.out.println("Sorted...");
  28. System.out.println(result);
  29. System.out.println(result2);
  30. }
  31. }

博文参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/805453
推荐阅读
相关标签
  

闽ICP备14008679号