如何按每个键值的大小对 LinkedHashMap 进行排序?



我有一个LinkedHashMap<整数,HashSet><整数>>,我想根据键值大小的递减顺序对键进行排序。我目前有这个片段从另一个线程,但我不知道如何改变它与我的情况下工作。

myMap.entrySet().stream()
         .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
         .collect(Collectors.toMap(
                  Map.Entry::getKey,
                  Map.Entry::getValue,
                  (x,y) -> {throw new AssertionError();},
                  LinkedHashMap::new
         ));

这是我尝试过的

List<Map.Entry<String, Integer>> entries =
  new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
  public int compare(Map.Entry<String, Integer> a, Map.Entry<String,Integer> b){
    return a.getValue().size().compareTo(b.getValue().size());
   }
});
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Map.Entry<String, Integer> entry : entries) {
  sortedMap.put(entry.getKey(), entry.getValue());
}

我只是在那里添加了。size()。我是从这个帖子里找到的。我所指的大小是指HashSet中的项数。它通常只是getValue().size(),但在这里不起作用。

排序LinkedHashMap

你的尝试很接近。下面是一个固定的版本:

List<Map.Entry<Integer, Set<Integer>>> entries = new ArrayList<>(
            map.entrySet());
Collections.sort(entries,
        new Comparator<Map.Entry<Integer, Set<Integer>>>() {
            public int compare(Map.Entry<Integer, Set<Integer>> a,
                    Map.Entry<Integer, Set<Integer>> b) {
                return Integer.compare(
                          a.getValue().size(),
                          b.getValue().size());
            }
        });
Map<Integer, Set<Integer>> sortedMap = new LinkedHashMap<>();
for (Map.Entry<Integer, Set<Integer>> entry : entries) {
    sortedMap.put(entry.getKey(), entry.getValue());
}

设置

 LinkedHashMap<Integer, Set<Integer>> map = new LinkedHashMap<>();
 map.put(1, new HashSet<>(Arrays.asList(1,2,3)));
 map.put(2, new HashSet<>(Arrays.asList(1,2)));
 map.put(3, new HashSet<>(Arrays.asList(1)));

和running

System.out.println(sortedMap);

排序后输出

<>之前{3=[1], 2=[1,2], 1=[1,2,3]}

最新更新