ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Map의 정렬
    Java 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;
        }
    }

     

    실행결과

    'Java' 카테고리의 다른 글

    문자열 뒤집기 예제  (0) 2020.12.10
    형변환 (type casting)  (0) 2020.12.04
    라이브러리를 사용한 배열 정렬  (0) 2020.11.30
    Collection Framework  (0) 2020.11.24
    콘솔 입력  (0) 2020.10.08

    댓글

Designed by Tistory.