Java

Map의 정렬

낙타선생 2020. 11. 28. 09:27
반응형

key 기준으로 자동정렬 되는 Map 타입들

HashMap, TreeMap은 entry를 추가할 때마다 key를 기준으로 오름차순 정렬되어 저장된다.

public class Exam {

    public static void main(String[] args) {
    	
        Map<String, String> map = new HashMap<>();
        //Map<String, String> map = new TreeMap<>();
        map.put("3", "Dave");
        map.put("1", "Mike");
        map.put("4", "John");
        map.put("2", "Judy");
        
        for(Map.Entry<String, String> entry : map.entrySet()) {
        	System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
    }
}

실행결과

entry의 순서가 추가한 순서대로 저장되길 원한다면 LinkedHashMap을 사용한다.

public class Exam {
    
    public static void main(String[] args) {
    	
        Map<String, String> map = new LinkedHashMap<>();
        map.put("3", "Dave");
        map.put("1", "Mike");
        map.put("4", "John");
        map.put("2", "Judy");
        
        for(Map.Entry<String, String> entry : map.entrySet()) {
        	System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
    }
}

실행결과

추가한 entry 순서가 보장되도록 하기 원하면 LinkedHashMap<E> 타입을 사용한다.

 

 

 

 

Key를 기준으로 정렬하기

import java.util.*;

public class Exam {

    public static void main(String[] args) {

        Map<String, String> map = new LinkedHashMap<>();
        map.put("3", "Dave");
        map.put("1", "Mike");
        map.put("4", "John");
        map.put("2", "Judy");

        System.out.println("=========== Origin Data  ============");
        for(Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
        System.out.println("=====================================\n");

        LinkedHashMap<String, String> resultAsc = sortMapByKey(map, 0);
        System.out.println("====== Sorted Data order by ASC =====");
        for(Map.Entry<String, String> entry : resultAsc.entrySet()) {
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
        System.out.println("=====================================\n");

        LinkedHashMap<String, String> resultDesc = sortMapByKey(map, 1);
        System.out.println("===== Sorted Data order by DESC =====");
        for(Map.Entry<String, String> entry : resultDesc.entrySet()) {
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
        System.out.println("=====================================");
    }

    public static LinkedHashMap<String, String> sortMapByKey(Map<String, String> map, Integer orderBy) {
        /***
         * Sort Map type data by key
         * @param map - unsorted Map type data [target]
         * @param orderBy - 0: ASC, 1: DESC
         * @return sorted LinkedHashMap type data by key.
         */
        List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet());	// ①
        if(orderBy == 0) {
            Collections.sort(entries, (o1, o2) -> o1.getKey().compareTo(o2.getKey()));	// ②
        }
        else {
            Collections.sort(entries, (o1, o2) -> o2.getKey().compareTo(o1.getKey()));
        }

        LinkedHashMap<String, String> result = new LinkedHashMap<>();	// ③
        for (Map.Entry<String, String> entry : entries) {
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    }
}

① 정렬을 위해 연결리스트를 사용하기 때문에 정렬할 Map 타입 객체의 entry set을 연결리스트에 넣어준다.

② Collections.sort() 메서드 첫번째 인자는 ①에서 만든 연결리스트를 두번째 인자로는 comparator 객체를 넣어준다. 여기서는 람다식을 사용하여 comparator 객체를 생성했다. 이 메서드가 실행되면 연결리스트의 내용이 정렬된다.

③ 정렬된 결과를 저장할 LinkedHashMap 타입 객체를 만들고 연결리스트의 내용을 넣은 후 반환한다.

 

실행결과

 

 

 

 

Value를 기준으로 정렬하기

import java.util.*;

public class Exam {

    public static void main(String[] args) {

        Map<String, String> map = new LinkedHashMap<>();
        map.put("3", "Dave");
        map.put("1", "Mike");
        map.put("4", "John");
        map.put("2", "Judy");

        System.out.println("=========== Origin Data  ============");
        for(Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
        System.out.println("=====================================\n");

        LinkedHashMap<String, String> resultAsc = sortMapByValue(map, 0);
        System.out.println("====== Sorted Data order by ASC =====");
        for(Map.Entry<String, String> entry : resultAsc.entrySet()) {
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
        System.out.println("=====================================\n");

        LinkedHashMap<String, String> resultDesc = sortMapByValue(map, 1);
        System.out.println("===== Sorted Data order by DESC =====");
        for(Map.Entry<String, String> entry : resultDesc.entrySet()) {
            System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue());
        }
        System.out.println("=====================================");
    }
    
    public static LinkedHashMap<String, String> sortMapByValue(Map<String, String> map, Integer orderBy) {
        /***
         * Sort Map type data by value
         * @param map - unsorted Map type data [target]
         * @param orderBy - 0: ASC, 1: DESC
         * @return sorted LinkedHashMap type data by value.
         */
        List<Map.Entry<String, String>> entries = new LinkedList<>(map.entrySet());
        if(orderBy == 0) {
            Collections.sort(entries, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));
        }
        else {
            Collections.sort(entries, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
        }

        LinkedHashMap<String, String> result = new LinkedHashMap<>();
        for (Map.Entry<String, String> entry : entries) {
            result.put(entry.getKey(), entry.getValue());
        }
        return result;
    }
}

 

실행결과