我有一个叫做map的HashMap,它将Characters作为键,将Integers作为值存储到一个名为entries的ArrayList中,使用以下代码:
Set<Entry<Character, Integer>> s = map.entrySet();
ArrayList<Entry<Character, Integer>> entries = new ArrayList<>(s);
现在我尝试根据Integer值而不是键对这些条目进行排序。我尝试使用lambda表达式来实现Comparator接口,但它无法正常工作。这是我的代码:
Collections.sort(sortedEntries, (sortedEntries.get(0), sortedEntries.get(1)) -> {
sortedEntries.get(0).getValue().compareTo(sortedEntries.get(1).getValue())
});
这些是我得到的错误:
此行有多个标记
语法错误,插入&#34;)&#34;完成表达
类型集合中的方法sort(List,Comparator)不适用于参数(ArrayList&gt;,Map.Entry,Map.Entry)
令牌上的语法错误&#34; - &gt;&#34; ,;预期
答案 0 :(得分:5)
您可以通过这种方式对列表进行排序:
list.sort(Comparator.comparing(Entry::getValue));
答案 1 :(得分:0)
您可以使用Java Stream API对实体进行排序,如下所示:
Set<Entry<Character, Integer>> s = map.entrySet();
List<Entry<Character, Integer>> sortedEntries = s.stream()
.sorted((a, b)-> Integer.compare(a.getValue(), b.getValue()))
.collect(Collectors.toList());
答案 2 :(得分:0)
Collections.sort(sortedEntries, (Entry<Character,Integer> o1, Entry<Character,Integer> o2)-> {return o1.getValue().compareTo(o2.getValue());});
答案 3 :(得分:0)
地图,列表或您尝试排序的类型没有什么特别之处。您对这样的列表进行排序的方式与排序其元素属于无法实现可比较类型的任何List的方式相同 - 使用比较器,就像您尝试这样做一样。所以你正走在正确的轨道上。
也许如果您对lambda表达式感到不舒服,请尝试实现Comparator接口。类型系统会强迫你做正确的事情,而不是依赖你来做正确的事情,这样它就能为你推断出类型。
(我在这里使用条目键,但您也可以使用该值)
public class EntryKeyComparator implements Comparator<Entry<Character,Integer>> {
@Override
public int compare(Entry<Character,Integer> a, Entry<Character,Integer> b) {
return a.getKey().compareTo(b.getKey());
}
}
现在,如果您真的想使用lambda表达式,则只需要查看此实现中的compare
方法。 lambda表达式必须带有两个参数a
和b
,并且必须返回一个int。因此,你会得到类似的东西:
Collections.sort(list, (a, b) -> a.getKey().compareTo(b.getKey()));
但是既然你已经进入Java 8世界,那么你也可以在Comparator类上使用静态comparing()
方法。它以Function
为参数,提取您要用来比较元素的键。在我的示例中,我通过getKey()
按键来比较条目。我们可以使用::
运算符引用此方法,因此您最终会得到一个这样的表达式(在List接口上使用新的sort()
方法):
list.sort(Comparator.comparing(Entry::getKey));