【问题标题】:Sort map in stream by LocalDateTime [duplicate]按 LocalDateTime 对流中的地图进行排序 [重复]
【发布时间】:2021-02-22 07:01:11
【问题描述】:

我有地图Map<LocalDateTime, String>

如何按键值对其进行排序?我应该使用什么比较器?

someMap.entrySet().stream().sorted(Comparator.comparing(???))

someMap.entrySet().stream().sorted(??)

我该如何解决?我应该写什么“??” ?

排序:

Key                      Value
2020-01-09 09:57:58.631  Some info
2020-01-09 09:57:59.224  Some info
2020-01-09 09:59:03.144  Info

没有排序:

Key                     Value
2020-01-09 09:57:58.631  Some info
2020-01-09 09:59:03.144  Info
2020-01-09 09:57:59.224  Some info

【问题讨论】:

  • 你能展示一个未排序的Map<LocalDateTime,String> 的例子,以及同一张地图的排序版本吗?
  • @Hulk 我应该在 compareTo 方法中指定什么?
  • 您的示例令人困惑。您应该显示已排序和未排序的 same 映射。此外,显示哪个日期或字符串应该具有更高的优先级。您是否首先按日期排序,如果日期相同,则按字符串排序?还是先按字符串排序,如果字符串相同,再按日期排序?
  • @Sweeper 不,我只需要按日期排序

标签: java sorting java-8 java-stream java-time


【解决方案1】:

你可以像这样使用.sorted(Map.Entry.comparingByKey())

Map<LocalDateTime, String> collect = someMap.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (o1, o2) -> o1, LinkedHashMap::new));

输出

{2020-04-01T12:27:48.054=info, 2020-04-17T11:15:13.423=info, 2020-04-29T11:01:21.372=info}

【讨论】:

  • 不知道Map.Entry.comparingByKey()。不错!
  • 是的,它来自Java-8,谢谢 :)
【解决方案2】:
Map<LocalDateTime, String> map = new HashMap<>();
map.put(LocalDateTime.of(2020, 4, 17, 11, 15), "Value A");
map.put(LocalDateTime.of(2020, 4, 1, 12, 27), "Value B");
map.put(LocalDateTime.of(2020, 4, 29, 11, 1), "Value C");
    
map.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(entry -> {
    System.out.println(entry);
});

会导致

2020-04-01T12:27=Value B
2020-04-17T11:15=Value A
2020-04-29T11:01=Value C

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 2019-07-21
    • 2019-06-26
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多