按键对哈希图进行排序,其中键是一对日期

Sorting a Hashmap by key, where key is a Pair of dates

我有一个像这样的 Hashmap:

Map<Pair<Date1, Date2>, Pair<DoesntMatter1, DoesntMatter2>> dates = new HashMap<>();

我想先按 Date1 (ascending/chronological) 对 Hashmap 进行排序,当 Date1 的日期相等时,再按 Date2。 如何以正确有效的方式做到这一点?

感谢任何帮助!

这里有几种方法。给定两条记录(类 也可以)。

record Pair<T> (T getItem1, T getItem2) {
}
record OtherObject() {}

第一个只是按照 Louis Wasserman 在评论中的建议建立一个 TreeMap。比较器首先比较该对中的第一项,如果相等,则比较第二项。为解决对象推理问题,第一个比较使用 lambda。接下来的比较就可以使用方法参考了。

Comparator<Pair<LocalDate>> comp = Comparator.comparing(
                    (Pair<LocalDate> p) -> p.getItem1())
                    .thenComparing(Pair::getItem2);

现在使用比较器建立TreeMap

NavigableMap<Pair<LocalDate>, Pair<OtherObject>> navigableMap = new TreeMap<>(comp);

第二种方法简单地根据映射键对映射条目进行排序并将它们放在列表中。比较器的第一项是 keyExtractor,其 return 类型在比较中使用 Pair<LocalDate>

List<Entry<Pair<LocalDate>,Pair<OtherObject>>> entryList = 
      someMap.entrySet().stream().sorted(Comparator.comparing(Entry::getKey,
               Comparator.comparing(
                    (Pair<LocalDate> p) -> p.getItem1())
                    .thenComparing(Pair::getItem2))).toList();

    

注意:TreeMap 实现 NavigableMap 扩展 SortedMap 扩展 Map