2016-01-16 99 views
-1

我讀過有關排序名單按字母順序,如:Hashmap sortingSorting Maps排序部分按字母順序

我有一個值,如

Tarantulas, 6 
Lions, 5 
Snakes, 2 
Zoopies, 2 
Zappin, 2 
Chapas, 1 
Zong Zwing, 1 
Chingos, 1 
Chapis, 1 
Grouches, 0 

我需要一個Map<String, Integer>(只)排序按字母順序排列相同點的部分。這是樣本數據,因此無法知道Map中的實際值,因此需要根據所存在的值進行排序。我已經分組/排序使用值:

public <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) { 
     Comparator<K> valueComparator = new Comparator<K>() { 
      public int compare(K k1, K k2) { 
       int compare = map.get(k2).compareTo(map.get(k1)); 
       if (compare == 0) { 
        return 1; 
       } else { 
        return compare; 
       } 
      } 
     }; 
     Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
     sortedByValues.putAll(map); 
     return sortedByValues; 
    } 

這是預期的結果:

Tarantulas, 6 
Lions, 5 
Snakes, 2 
Zappin, 2 
Zoopies, 2 
Chapas, 1 
Chapis, 1 
Chingos, 1 
Zong Zwing, 1 
Grouches, 0 

所以問題是:我如何排序只具有相同點地圖的那些部分(整數值),並保持原樣?

我使用的Java 7

+0

使用地圖是強制性的嗎?我會使用一組對象來代替。 – SimoV8

+0

我用了一個比較器。將該代碼添加到問題中,但我不認爲它可能有用。您可以看到Map按照值排序,並且Map中的整數值被分組在一起。 –

+1

你不應該使用地圖。使用列表,其中動物是一個具有名稱和價值的類。使用按值排序的比較器進行排序,然後按名稱排序。 –

回答

1

嘗試:

public <K extends Comparable<K>, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) { 
    Comparator<K> valueComparator = new Comparator<K>() { 
     public int compare(K k1, K k2) { 
      int compare = map.get(k2).compareTo(map.get(k1)); 
      if (compare == 0) { 
       return k1.compareTo(k2); // <- To sort alphabetically 
      } else { 
       return compare; 
      } 
     } 
    }; 
    Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator); 
    sortedByValues.putAll(map); 
    return sortedByValues; 
} 
+0

這將舊地圖,新地圖和其中的條目結合在一起,使整個事物幾乎是只讀的。如果做了任何更改,就會出現一致性錯誤。 – Henry

1

下面是如何使用比較例子。排序後,您可以將集合中的所有條目放入LinkedHashMap以保留元素的順序。

public static void main(String[] args) { 

    Map<String,Integer> map = new HashMap<String, Integer>(); 

    map.put("Tarantulas", 6); 
    map.put("Lions", 5); 
    map.put("Snakes", 2); 
    map.put("Zoopies", 2); 
    map.put("Zappin", 2); 
    map.put("Chapas", 1); 
    map.put("Zong Zwing", 1); 
    map.put("Chingos", 1); 
    map.put("Chapis", 1); 
    map.put("Grouches", 0); 

    SortedSet<Map.Entry<String, Integer>> sortedSet = new TreeSet<>(new Comparator<Map.Entry<String,Integer>>() { 
     @Override 
     public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 

      int result = o1.getValue().compareTo(o2.getValue()); 
      result*=-1; 
      if(result==0) 
       result = o1.getKey().compareTo(o2.getKey()); 

      return result; 
     } 
    }); 

    sortedSet.addAll(map.entrySet()); 


    for(Entry<String, Integer> entry:sortedSet) 
     System.out.println(entry.getKey()+"="+entry.getValue()); 

} 
+0

爲什麼不使用'List'作爲結果結構? – Henry

+1

然後他失去了地圖功能。 –