排序列表<Map.Entry<String>>以主要和次要方式?



好的。所以我有一个映射的数组列表<字符串,整数>:

Set<Map.Entry<String, Integer>> wordSet = map.entrySet();
List<Map.Entry<String, Integer>> wordList = new ArrayList<>(wordSet);

wordList.sort((w1, w2) -> w2.getValue().compareTo(w1.getValue()));

正如您在这里看到的,这种排序将仅基于Map<K、 V>。我想修改lambda表达式,使其PRIMARY检查最大值,SECONDARY检查字母顺序。然而,我不知道如何以这种有Primary和Secondary两种方式的方式创建lambda表达式。

请改用Comparator实用程序方法。将当前替换为:

wordList.sort(Comparator.comparing(Map.Entry::getValue))

这个实用程序方法生成一个比较器,它做您的比较器所做的事情:通过调用getValue映射两个条目,然后比较该对象。

所有比较器都有一个.thenComparing方法:

Comparator<Map.Entry<String, Integer>> secondOrder = Comparator.comparing(e -> e.getKey());
wordList.sort(Comparator.comparing(Map.Entry::getValue).thenComparing(secondOrder));

这将在值上进行比较,如果值相等,则在键上进行比较。你可以随心所欲地进行比较。

似乎需要按值((降序对映射条目进行排序,然后按字母顺序按键(单词(对进行排序。

Map.Entry有自己的静态比较器方法Map。条目::comparingByValue和Map。条目::comparingByKey,可使用Comparator::thenComparing:加入

wordList.sort(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder())
.thenComparing(Map.Entry.comparingByKey()));

此外,可以使用Comparator::reversed代替Comparator::reverseOrder:

wordList.sort(Map.Entry.<String, Integer>comparingByValue()
.reversed()
.thenComparing(Map.Entry.comparingByKey())
);

最新更新