2009-12-12 4 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} 

이을 descencing 그것을 을 정렬하려면 다음 Comparator을 사용합니다. 기본적으로 단지 비교 항목을 교환 : 여기

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; 

}

관련 문제