我用Java编写了程序一词,并提出了单词和频率列表。结果当前存储在LinkedHashMap中。结果如下所示:
garden-->2
road-->4
street-->5
park-->5
highway-->5
在上面的结果集中,存储在LinkedHashMap中,如何对其进行排序以仅对具有相同频率的键进行排序。我们仍然希望维持频率顺序。
结果看起来像:
garden-->2
road-->4
highway-->5
park-->5
street-->5
谢谢。
答案 0 :(得分:2)
我能够以类似于鲍里斯建议的答案来完成此任务。但是,我使用的任何IDE都拒绝推断泛型类型,因此我必须在第一次调用Comparator#comparing
时明确指定它们,如下所示:
Map<String, Integer> map = new LinkedHashMap<>();
map.put("garden", 2);
map.put("road", 4);
map.put("street", 5);
map.put("park", 5);
map.put("highway", 5);
map = map.entrySet()
.stream()
.sorted(Comparator.<Entry<String, Integer>, Integer>comparing(Entry::getValue)
.thenComparing(Comparator.comparing(Entry::getKey)))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (k, v) -> {
throw new IllegalStateException(String.format("Duplicate Key: %s", k));
}, LinkedHashMap::new));
System.out.println(map);
上面的代码产生以下输出:
{garden = 2,road = 4,highway = 5,park = 5,street = 5}
我注意到您希望值以降序顺序排列,但共享值的键将以升序顺序排列。以下是该解决方案(几乎完全相同):
map = map.entrySet()
.stream()
.sorted(Comparator.<Entry<String, Integer>, Integer>comparing(Map.Entry::getValue).reversed()
.thenComparing(Comparator.comparing(Entry::getKey)))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (k, v) -> {
throw new IllegalStateException(String.format("Duplicate key %s", k));
}, LinkedHashMap::new));
注意:Entry
引用java.util.Map.Entry
,Collectors
引用java.util.stream.Collectors
。
答案 1 :(得分:1)
如果你正在寻找JAVA7或更低版本,遵循简单的代码可以完成你的工作。
Map<String, Integer> map = new LinkedHashMap<>();
map.put("garden", 2);
map.put("road", 4);
map.put("street", 5);
map.put("park", 5);
map.put("highway", 5);
List<Entry<String, Integer>> list = new ArrayList<>();
list.addAll(map.entrySet());
Collections.sort(list, new Comparator<Entry<String, Integer>>() {
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o1.getValue()-o2.getValue() != 0 ? o1.getValue()-o2.getValue() : o1.getKey().compareTo(o2.getKey());
}
});
System.out.println(list);
输出: -
[garden = 2,road = 4,highway = 5,park = 5,street = 5]
我想,雅各布实施的代码在这里做了同样的工作。