2015-10-19 88 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]} 
相關問題