首先根据键然后值对哈希映射进行排序

时间:2014-11-16 01:00:32

标签: java sorting hashmap

我需要根据值然后根据键对哈希映射进行排序。

TreeMap<String,Integer> dictionary = new TreeMap<String,Integer>();

例如,所需的输出类似于:

it - 2
of - 2
the - 2
times - 2
was - 2
best - 1
worst - 1

我尝试了树形图,但只根据键对其进行排序。 基本上,我需要根据整数(从最高到最低)然后根据字符串(第一个A然后是B到Z)对我的第一个进行排序。 我在网上搜索,看到我将不得不使用比较器,但我不知道如何让它工作? 任何指导将不胜感激。

这是Java任务。

2 个答案:

答案 0 :(得分:3)

Map界面没有&#34; order&#34;的概念,但您可以对条目进行排序:

Map<String, Integer> map; // populated
List<Map.Entry<String, Integer>> entries = new ArrayList<> (map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
    public int compareTo(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
        return a.getValue().equals(b.getValue()) ? a.getKey().compareTo(b.getKey()) : Integer.compareTo(b.getValue(), a.getValue());
    }
});
for (Map.Entry<String, Integer> entry : entries)
    System.out.println(entry.getKey() + " - " + entry.getValue());

如果java 8可用,它会变得更加整洁:

Map<String, Integer> map; // populated
map.entrySet().stream()
    .sorted( (a, b) -> a.getValue().equals(b.getValue()) ? a.getKey().compareTo(b.getKey()) : Integer.compareTo(b.getValue(), a.getValue()))
    .map(e -> entry.getKey() + " - " + entry.getValue())
    .forEach(System.out::println);

如果绝对需要地图,请将其加载到LinkedHashMap,其中&#34;保留订单&#34;因为它按照插入的顺序迭代其条目。

答案 1 :(得分:0)

(我假设这就像Java一样)。排序地图仅处理键,而不是值。您可能只想将地图内容加载到新的TreeMap中,其中每个键都是原始键,并以某种方式组合值。或者,您可以加载到列表中并对其进行排序,或使用Set。