我有以下正常运行的代码:
Map<String, List<String>> map = Arrays.stream(input)
.collect(groupingBy(s -> s.split("\\s+")[0],
TreeMap::new, toList()));
但我需要TreeMap按降序排序。我试过了:
Map<String, List<String>> map = Arrays.stream(input)
.collect(groupingBy(s -> s.split("\\s+")[0],
new TreeMap<>((a, b) -> b.compareTo(a)), toList()));
但是我收到错误“无法找到与对象比较的符号”。
如何让TreeMap接受比较器?它有可能吗?
答案 0 :(得分:2)
需要一个Supplier<Map>
,您可以使用这样的lambda:
() -> new TreeMap<>((a, b) -> b.compareTo(a))
也因为你只想颠倒顺序,你可以使用Comparator
类中提供的方法:
() -> new TreeMap<>(Comparator.reverseOrder())
答案 1 :(得分:0)
可能有另一种方法可以做到这一点,但我使用了
String[] input = { "a", "b", "c" };
Map<String, List<String>> map = new TreeMap<>((a, b) -> b.compareTo(a));
map.putAll(Arrays.stream(input).collect(
groupingBy(s -> s.split("\\s+")[0], TreeMap::new, toList())));
System.out.println(map);
输出
{c=[c], b=[b], a=[a]}
答案 2 :(得分:0)
您必须将比较器传递到树形图,如下所示,它将按照比较器的实现以某种顺序存储值。以下代码将允许您按降序存储值。
TreeMap<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
public int compare(String string1, String string2) {
if (string1.compareTo(string2) > 0) {
return -1;
} else if (string1.compareTo(string2) < 0) {
return 1;
} else {
return 0;
}
};
});
另一种替代方法是使用TreeMap中的以下API从降序获取密钥,然后从中检索值。
Set<String> keySet = treeMap.descendingKeySet();
for (String key : keySet) {
System.out.println(treeMap.get(key));
}