我需要根据值然后根据键对哈希映射进行排序。
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任务。
答案 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。