按地图排序列表,使用键和后值

时间:2013-08-07 07:04:59

标签: java sorting

我需要使用Map的键对Map进行排序。先看看代码,然后听我说。我想按键排序List,然后按Value排序。毕竟结果应该是以下(仅返回List中的值):

/*  The result(List): 
    str3
    str1
    str2
    str4 */

-

List<String> list = ArrayList<>();
list.add("str1");
list.add("str1");
list.add("str3");
list.add("str4"); .......
Map<String, Integer> counts = new HashMap<>();
for (String item:list) {
    Integer count = counts.get(item);
    if (count == null) {
        count = 1;
    } else {
        count = count + 1;
    }
    counts.put(item, count);
}

for (Entry<String, Integer> entry : counts.entrySet()) {
    System.out.println(entry.getValue() + " " + entry.getKey());
}

-

 /*  The result: 
        2 str1
        3 str2
        1 str3
        3 str4 */

2 个答案:

答案 0 :(得分:1)

制作自定义比较器:

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String left, String right) {
        return Integer.compare(counts.get(left), counts.get(right));
    }
});

请注意,您需要counts final才能生效。


在你的例子上运行:

public class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("str1");
        list.add("str2");
        list.add("str3");
        list.add("str4");
        final Map<String, Integer> counts = new HashMap<>();
        counts.put("str1", 2);
        counts.put("str2", 3);
        counts.put("str3", 1);
        counts.put("str4", 3);

        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String left, String right) {
                return Integer.compare(counts.get(left), counts.get(right));
            }
        });

        System.out.println(list);
    }
}

收率:

[str3, str1, str2, str4]

答案 1 :(得分:0)

如果要阅读按键排序的Mapentries,可以使用Treemap。 购买也许你可以重新解释这个问题,结果应该是什么不太清楚。