如何为MapFactory指定Comparator

时间:2014-08-27 02:53:51

标签: java

我有以下正常运行的代码:

    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接受比较器?它有可能吗?

3 个答案:

答案 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));
}