java 맵 정렬 방법 (맵 집합 사용)

오늘 통계를 작성할 때 X축의 지역에 대해 지역 코드(areaCode)에 따라 정렬해야 한다. XMLData를 구축하는 데 사용되는 맵으로 데이터 통계를 하기 때문에 통계 과정에서 맵을 정렬해야 한다.
1. 맵을 간단히 소개하기 전에 맵 정렬을 설명하기 전에 맵을 조금 알아봅시다.맵은 키 값이 맞는 집합 인터페이스로 그 실현 클래스는 주로 HashMap, TreeMap, Hashtable, LinkedHashMap 등을 포함한다.이 네 가지 차이점은 다음과 같습니다(간단한 설명).
HashMap: 우리가 가장 자주 사용하는 맵은 키의 HashCode 값에 따라 데이터를 저장하고 키에 따라 그 값을 직접 얻을 수 있으며 매우 빠른 접근 속도를 가진다.HashMap은 최대 한 개의 기록된 키 값만 Null로 허용합니다.여러 레코드를 허용하는 Value는 Null입니다.비동기적.
TreeMap: 저장된 기록을 키에 따라 정렬할 수 있습니다. 기본값은 오름차순으로 정렬할 수도 있고, 정렬할 비교기를 지정할 수도 있습니다. Iterator로 TreeMap을 훑어볼 때 기록은 정렬된 것입니다.TreeMap에서 키의 값이null이면 안 됩니다.비동기적.
Hashtable:HashMap과 유사하지만 다른 것은:key와value의 값은null로 허용되지 않습니다.이것은 스레드의 동기화를 지원합니다. 즉, 언제든지 하나의 스레드만 Hashtable을 쓸 수 있기 때문에 Hashtale가 쓸 때 비교적 느리게 됩니다.
LinkedHashMap: 기록의 삽입 순서를 저장합니다. Iterator로 LinkedHashMap을 훑어볼 때 먼저 받은 기록은 먼저 삽입된 것이 틀림없습니다.돌아다니면서 Hash Map보다 느릴 거예요.키와value는 모두 비동기식으로 허용됩니다.
 
2. 지도 정렬 TreeMap
TreeMap은 기본적으로 오름차순이며, 정렬 방식을 바꾸려면 비교기:Comparator를 사용해야 합니다.Comparator는 집합 대상이나 그룹을 정렬할 수 있는 비교기 인터페이스로 이 인터페이스를 실현하는publiccompare(T o1, To2) 방법으로 정렬을 실현할 수 있다. 이 방법은 주로 첫 번째 매개 변수 o1에 따라 작거나 같거나 o2보다 크거나 각각 음정수, 0 또는 정수를 되돌려준다.다음과 같습니다.

public class TreeMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<String, String>(
                new Comparator<String>() {
                    public int compare(String obj1, String obj2) {
                        //
                        return obj2.compareTo(obj1);
                    }
                });
        map.put("c", "ccccc");
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("d", "ddddd");

        Set<String> keySet = map.keySet();
        Iterator<String> iter = keySet.iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            System.out.println(key + ":" + map.get(key));
        }
    }
}
실행 결과는 다음과 같습니다.
d:ddddd c:ccccc b:bbbbb a:aaaaa
위의 예는 TreeMap의 키 값에 따라 정렬하는 것이지만, 때때로 우리는 TreeMap의value에 따라 정렬해야 한다.value 정렬에 대해 우리는 Collections의sort(Listlist,Comparatorc) 방법을 빌려야 한다. 이 방법은 지정된 비교기에서 발생하는 순서에 따라 지정된 목록을 정렬한다.그러나 모든 원소는 제공된 비교기에 따라 비교할 수 있어야 한다는 전제조건이 있다.다음과 같습니다.

public class TreeMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new TreeMap<String, String>();
        map.put("d", "ddddd");
        map.put("b", "bbbbb");
        map.put("a", "aaaaa");
        map.put("c", "ccccc");

        // map.entrySet() list
        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        //
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }

        });

        for(Map.Entry<String,String> mapping:list){
               System.out.println(mapping.getKey()+":"+mapping.getValue());
          }
    }
}
실행 결과
a:aaaaa b:bbbbb c:ccccc d:ddddd
HashMap
우리는 모두 HashMap의 값입니다. 순서가 없습니다. 그는 키의 HashCode에 따라 이루어집니다.이 무질서한 Hash Map에 대해 어떻게 정렬을 해야 하나요?TreeMap의 value 정렬을 참조하면 HashMap의 정렬도 마찬가지입니다.

public class HashMapTest {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        map.put("c", "ccccc");
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("d", "ddddd");

        List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
            //
            public int compare(Entry<String, String> o1,
                    Entry<String, String> o2) {
                return o1.getValue().compareTo(o2.getValue());
            }

        });

        for(Map.Entry<String,String> mapping:list){
               System.out.println(mapping.getKey()+":"+mapping.getValue());
          }
     }
}
실행 결과
a:aaaaa b:bbbbb c:ccccc d:ddddd

좋은 웹페이지 즐겨찾기