2015-10-19 89 views
1

我有一个LinkedHashMap < Integer,HashSet < Integer >>我想根据它们值的大小递减顺序对键进行排序。我目前有来自另一个线程的这个片段,但我不知道如何改变它来处理我的案例。如何按每个键值的大小对LinkedHashMap进行排序?

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(),但它在这里不起作用。

Sorting LinkedHashMap

+1

的可能的复制[如何排序地图在Java中的值?]( http://stackoverflow.com/questions/109383/how-to-sort-a-mapkey-value-on-the-values-in-java) –

+0

我试着实现他们所做的(o1.getValue()。size ())。compareTo(o2.getValue()。size())但它没有工作。我不知道如何比较值的大小是我的问题。 – pmdaly

+0

没有你在帖子中试过的东西的痕迹。请通过编辑并参考其他答案来添加它。实际上,我会说你没有在这段代码片段中隐藏发生了什么。你应该尝试分析它。还请澄清“'...他们的值的大小”(这是否意味着字符串长度?)编辑您的文章! –

回答

1

你试过什么接近。这里有一个固定的版本:

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))); 

和排序输出后运行

System.out.println(sortedMap); 

 
{3=[1], 2=[1, 2], 1=[1, 2, 3]} 
相关问题