0

我需要使用 Map 的键按 Map 对 List 进行排序。先看代码,后听我说。我想按键排序列表,然后按值排序。毕竟结果应该如下(仅返回 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 */
4

2 回答 2

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]
于 2013-08-07T07:07:41.963 回答
0

当您想读取按键排序的 Mapentries 时,可以使用Treemap。购买也许您可以改写问题,目前还不清楚结果应该是什么。

于 2013-08-07T07:08:17.637 回答