2017-08-30 58 views
0

我想將Comparator重新定義爲HashSet的大小,但是我得到比較方法必須覆蓋或實現超類型方法的錯誤。根據值的數量對TreeMap排序

如何用Hashset大小比較創建TreeMap?

private Map<Integer, HashSet<Integer>> nodes = new TreeMap<>(
    new Comparator(){ 
     @Override 
     public int compare(HashSet<Integer> o1 , HashSet<Integer> o2) {  
      return (o1.size()).compareTo(o2.size()); 
          //o2.size().compareTo(o1.size()); 
     } 
    }); 
+6

'TreeMap'各種各樣的關鍵,而不是價值。它期待一個'比較器<?超級整數>'。 – shmosel

回答

0

您可以使用比較和對比寫代碼,基於HashSet的尺寸如下值進行排序:

import java.util.Comparator; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Map; 
import java.util.TreeMap; 

public class Solution { 
    public static void main(String[] args) { 
     Map<String, HashSet<Integer>> map = new HashMap<String, HashSet<Integer>>(); 
     HashSet<Integer> aSet = new HashSet<>(); 
     aSet.add(1); 
     aSet.add(2); 
     aSet.add(3); 
     aSet.add(4); 
     aSet.add(5); 
     map.put("a", aSet); 
     HashSet<Integer> bSet = new HashSet<>(); 
     bSet.add(1); 
     bSet.add(2); 
     bSet.add(3); 
     bSet.add(4); 
     map.put("b", bSet); 
     HashSet<Integer> cSet = new HashSet<>(); 
     cSet.add(1); 
     cSet.add(2); 
     cSet.add(3); 
     cSet.add(4); 
     cSet.add(5); 
     cSet.add(6); 
     cSet.add(7); 
     map.put("c", cSet); 
     System.out.println(map); 

     Map sortedMap = sortByValue(map); 
     System.out.println(sortedMap); 
    } 

    public static Map sortByValue(Map unsortedMap) { 
     Map sortedMap = new TreeMap(new ValueComparator(unsortedMap)); 
     sortedMap.putAll(unsortedMap); 
     return sortedMap; 
    } 

} 

class ValueComparator implements Comparator { 
    Map map; 

    public ValueComparator(Map map) { 
     this.map = map; 
    } 

    public int compare(Object keyA, Object keyB) { 
     HashSet<Integer> valueA = (HashSet<Integer>) map.get(keyA); 
     HashSet<Integer> valueB = (HashSet<Integer>) map.get(keyB); 
     Integer valASize = valueA.size(); 
     Integer valBSize = valueB.size(); 
     return valASize.compareTo(valBSize); 
    } 
}