2009-12-12 6 views

答えて

13

HashMap(およびその旧いプレセッサーHashtable)は、本質的に順序付けられていない。ソートしても、順序は変わりません。広告掲載オーダーを維持する場合は、代わりにLinkedHashMapを使用してください。 のキーの自動ソートを希望する場合は、挿入順に関係なくSortedMapを使用してください。

の値をに並べ替える場合は、基本的に別の種類のソート可能なデータ構造にキー/値のペアを配置する必要があります。 List<Entry<K, V>>を入力し、Compatator<Entry<K, V>>の助けを借りてCollections#sort()を使用してソートし、最後にLinkedHashMapを再充填します(HashMapではありません)。

ここでは基本的な例(脇取り扱い明らか実行時例外を残して)です:

// Prepare. 
Map<String, String> map = new HashMap<String, String>(); 
map.put("foo", "bar"); 
map.put("bar", "waa"); 
map.put("waa", "foo"); 
System.out.println(map); // My JVM shows {waa=foo, foo=bar, bar=waa} 

// Get entries and sort them. 
List<Entry<String, String>> entries = new ArrayList<Entry<String, String>>(map.entrySet()); 
Collections.sort(entries, new Comparator<Entry<String, String>>() { 
    public int compare(Entry<String, String> e1, Entry<String, String> e2) { 
     return e1.getValue().compareTo(e2.getValue()); 
    } 
}); 

// Put entries back in an ordered map. 
Map<String, String> orderedMap = new LinkedHashMap<String, String>(); 
for (Entry<String, String> entry : entries) { 
    orderedMap.put(entry.getKey(), entry.getValue()); 
} 

System.out.println(orderedMap); // {foo=bar, waa=foo, bar=waa} 

は、次のComparatorを使用し、をdescencingそれをソートします。基本的にはちょうど比較するのエントリを入れ替える:ここ

Collections.sort(entries, new Comparator<Entry<String, String>>() { 
    public int compare(Entry<String, String> e1, Entry<String, String> e2) { 
     return e2.getValue().compareTo(e1.getValue()); // Sorts descending. 
    } 
}); 
0

は、私はそれを行う方法です。

public static <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; 

}

関連する問題