使用相同值对键进行排序 - > LinkedHashMap

时间:2018-02-03 16:47:41

标签: java

我用Java编写了程序一词,并提出了单词和频率列表。结果当前存储在LinkedHashMap中。结果如下所示:

garden-->2
road-->4
street-->5
park-->5
highway-->5

在上面的结果集中,存储在LinkedHashMap中,如何对其进行排序以仅对具有相同频率的键进行排序。我们仍然希望维持频率顺序。

结果看起来像:

garden-->2
road-->4
highway-->5
park-->5
street-->5

谢谢。

2 个答案:

答案 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.EntryCollectors引用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]

我想,雅各布实施的代码在这里做了同样的工作。