차근차근/JAVA JSP

[Java] Map, Table의 value 값 정렬

예쁜꽃이피었으면 2014. 9. 12. 10:09

http://antonio91.egloos.com/viewer/5527386


TreeMap이라고 하여 key 값으로 자동 정렬해주는 데이터구조는 있지만

value값으로는 정렬이 불가능하다. 이를 위해서는 Comparator를 재정의하여 사용할 수 있다.

예제에서는 Hashtable을 사용하나, HashMap 등 key, value값으로 이루어진 데이터 구조는 모두 동일하게 사용 가능하다고 본다.


List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(table.entrySet());


우선 table의 entrySet을 받아서 ArrayList에 저장한다. 이 때 중요한 점은 ArrayList의 타입이 Map.Entry<K,V> 라는 것이다.

이렇게 하면 List에 key, value의 object를 저장할 수 있다.


Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {

  public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2)

  {

    if (e1.getValue() == e2.getValue())

      return e1.getKey().compareTo(e2.getKey());

    else

    return e2.getValue().compareTo(e1.getValue());

  }

});


이 list에 대해 Collections의 sort 함수를 사용하는데 이때 Comparator를 정의한다.
compare 함수에서는 value 값인 integer 값을 비교하며, (위와 같은 방식이면 내림차순)
만약 value 값이 같으면 key 값을 비교하여 오름차순으로 정렬되도록 한다.
이렇게 sort함수에 넣으면 list 는 정렬이 되고, 이 list를 출력해보면 정렬된 결과를 얻을 수 있다.
하지만 List의 타입이 Map.Entry<String, Integer> 이기 때문에 여간 불편한게 아니다.
그래서 HashMap에 넣는다.

LinkedHashMap<String, Integer> result = new LinkedHashMap<String, Integer>();
for (Map.Entry<String, Integer> e : list)
  result.put(e.getKey(), e.getValue());

그냥 HashMap에 넣을 경우 put 과정에서 순서 보장이 안되므로 LinkedHashMap에 넣어야 한다.
그래서 어차피 LinkedHashMap은 HashMap을 상속받은거라 HashMap으로 return하는데는 문제가 없다.


반응형