Collection.sort使用匿名类Comparator

时间:2018-04-23 19:00:38

标签: java dictionary collections comparator anonymous-class

我没有找到所需信息,所以我决定创建一个新问题。

我有一个小测试应用,我想按值排序我的Map。但我无法理解为什么我不能通过以下方式做到这一点:

    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.Map;

    public class Test {

    public int test(int [] array) {

        Map<Integer, Integer> map = new HashMap<>();
        map.put(1,4);
        map.put(2,3);
        map.put(5,1);
        map.put(7,0);
        map.put(4,4);
        map.put(9,1);

        Collections.sort(map.entrySet(), new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> t, Map.Entry<Integer, Integer> t1) {
                return t.getValue().compareTo(t1.getValue());
            }
        });


        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            sum += entry.getValue();
        }

        return sum;
    }

}

和主要课程:

public class Main {

    public static void main(String[] args) {

        Test test = new Test();
        System.out.println(test.test(arr));
    }
}

在这种情况下,这个应用程序将返回14。但我有这个消息 Collections.sort(...)部分:

  集合中的

sort(java.util.List,java.util.Comparator)无法应用于   (java.util.Set中&gt;中   匿名   了java.util.Comparator&GT)   原因:没有类型变量T的实例存在   集&gt;符合List

但如果我将其更改为 Collections.min(...) Collections.max(...)

Collections.min(map.entrySet(), new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> t, Map.Entry<Integer, Integer> t1) {
                return t.getValue().compareTo(t1.getValue());
            }
        });

没有问题。

1 个答案:

答案 0 :(得分:1)

无法按值对Java Map进行排序。但您可以从Map.entrySet()创建列表,也可以根本不需要集合。

使用List和Comparator。

List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
list.sort(Comparator.comparing(Map.Entry::getValue));

使用Stream

map.entrySet().stream()
        .sorted(Comparator.comparing(Map.Entry::getValue))
        //do something here