Java中的比较器问题

时间:2018-04-09 14:24:37

标签: java sorting

我在Java中有Map<String, AtomicInteger> map,我试图根据值排序(然后打印)。我找到了一种似乎足够快的方法,首先是制作一个数组Object[] a = map.entrySet().toArray(); 然后我尝试按照这样排序

Arrays.sort(a, Comparator.comparingInt((Object entry) -> entry.getValue().get()))

或者像这样:

Arrays.sort(a, new Comparator() {
        public int compare(Object o1, Object o2) {
            return ((Map.Entry<String, AtomicInteger>) o2).getValue()
                    .compareTo(((Map.Entry<String, AtomicInteger>) o1).getValue());
        }
    })

不幸的是,这些语法都有些错误。在第一种情况下,它无法识别函数getValue(),它在比较的秒内不起作用。有人可以建议修改语法以使其工作吗?

2 个答案:

答案 0 :(得分:2)

这里:

Arrays.sort(a, Comparator.comparingInt((Object entry) -> entry.getValue().get()))

您声明参数为Object。但它不是。这是一个条目。令人惊讶的是,班级Object没有像getValue()这样的方法!

你不应该首先给出类型:

Arrays.sort(a, Comparator.comparingInt(e -> entry.getValue().get()))

应该这样做。

是的,我错过了:第一个问题是a应该是Entry值不是Object[]的数组。

此外:使用具有某种意义的名称。 a意味着......没有。

答案 1 :(得分:1)

为什么要提取成阵列?为什么不直接在条目上使用sorted()

例如:

private static List<Map.Entry<String, AtomicInteger>> sortedEntries(
        Map<String, AtomicInteger> map) {
    return map.entrySet()
        .stream()
        .sorted(Comparator.comparingInt(entry -> entry.getValue().get()))
        .collect(Collectors.toList());
}