在java中按值排序Map

时间:2015-01-27 04:30:50

标签: java sorting dictionary

我的目标是给出一个返回升序数组/排序键值列表的映射。例如:

输入:包含以空格分隔的以下键/值条目的地图:

"Apple" 10
"Orange" 8
"Kiwi" 15

输出:

{Orange;Apple;Kiwi}

我能想到的唯一另一种方法是创建一个Map<Integer,Set<String>>,然后按相当复杂的键进行排序。我得到了这种方法,但在代码和逻辑方面似乎效率很低。非常感谢!

3 个答案:

答案 0 :(得分:1)

一种技术是将Map推送到List中,然后使用Comparator对值进行排序,然后再将其放回Map中。

例如,像:

List<Map.Entry<String, Integer>> list = 
            new LinkedList<Map.Entry<String, Integer>>(mapYouPassedIn.entrySet());

然后你可以使用Collections.sort()和一个Comparator来对这个列表进行笨拙的工作。

答案 1 :(得分:1)

java 8 中,使用流有一种非常简单的方法:

map.entrySet().stream()
    .sorted(Map.Entry.comparingByValue())
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

例如:

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("A", 2);
        map.put("B", 3);
        map.put("C", 1);
        System.out.println(map.entrySet().stream()
            .sorted(Map.Entry.comparingByValue())
            .map(Map.Entry::getKey)
            .collect(Collectors.toList()));
    }
}

打印[C,A,B]

答案 2 :(得分:0)

您可以从hashMap获取entrySet并对Map.entry列表进行排序。 例如:

List<Map.Entry<Integer, Integer>> list = new LinkedList<Map.Entry
<Integer,    Integer>>( map.entrySet() );
    Comparator<Map.Entry<Integer, Integer>> comp = 
new   Comparator<Map.Entry<Integer, Integer>>()
    {

        @Override
        public int compare( Entry<Integer, Integer> o1, Entry<Integer, Integer> o2 )
        {
            return ( o1.getValue() ).compareTo( o2.getValue() );
        }
    };

    Comparator<Map.Entry<Integer, Integer>> cmp1 = Collections.reverseOrder( comp );
    Collections.sort( list, cmp1 );