[Java] HashMap Key(키)/Value(밸류) 기준 정렬

Kim Ji Eun·2022년 4월 4일
1

Java

목록 보기
3/9

키(Key) 기준 정렬

HashMap을 Key로 정렬하기 위해서는 Arrays.sort 메소드를 사용한다.
Arrays.sort 사용하기 위해서 java.util.Arrays를 import 해줘야 한다.

        // key 값 기준 정렬
        HashMap<Integer, Integer> map = new HashMap<>();

        map.put(6, 1);
        map.put(1, 2);
        map.put(4, 3);
        map.put(10, 4);
        map.put(7, 5);


        Object[] mapKey = map.keySet().toArray();
        Arrays.sort(mapKey);

        System.out.println("오름차순 정렬");
        for (Integer key : map.keySet()) {
            System.out.println(key + " : " + map.get(key));
        }

map 에 키를 6,1,4,10,7 순서로 데이터를 추가한다.
Object 클래스를 선언하고 mapKey에 key를 저장한다.
키만 추출한 Object 클래스인 변수 mapKey를 Arrays.sort 사용하여 정렬한다.
keySet()을 반복문 돌려 출력한다.

(결과)

오름차순 정렬
1 : 2
4 : 3
6 : 1
7 : 5
10 : 4

++ 추가

위 경우처럼 Key가 Integer이라면 정렬이 잘 되지만 Key가 String인 경우에는 적용이 되지 않음을 깨달았다.
2가지 정렬 방법을 더 소개해보겠다.

1) TreeMap 사용
애초에 값을 넣을 때 정렬이 된 채로 저장이 되는 Map이다.
HashMap을 TreeMap으로 바꿔서 사용하거나 처음부터 HashMap으로 선언하고 사용하자

        //Map<String,Integer> testMap = new TreeMap<>(map); 
        Map<String,Integer> testMap = new TreeMap<>(); 

        testMap.put("apple", 1);
        testMap.put("pineapple", 2);
        testMap.put("orange", 3);
        testMap.put("strawberry", 4);
        testMap.put("melon", 5);

        // 결과 출력
        for (Integer nKey : testMap.keySet()) {
            System.out.println(nKey + " " + testMap.get(nKey));
        }

2) Object[] mapKey를 사용하기
위 방법으로 했을 때 mapKey 배열은 정렬이 된 Map이 된다. Map의 사용이 필요없고 단지 정렬된 값을 출력하는 용도가 필요하다면 이 배열을 반복문 돌려서 사용하자

        Map<String,Integer> testMap = new TreeMap<>();

        testMap.put("apple", 1);
        testMap.put("pineapple", 2);
        testMap.put("orange", 3);
        testMap.put("strawberry", 4);
        testMap.put("melon", 5);

        // 키로 정렬
        Object[] mapkey = testMap.keySet().toArray();
        Arrays.sort(mapkey);

        // 정렬안됨 
        for (Integer nKey : testMap.keySet()) {
            System.out.println(nKey + " " + testMap.get(nKey));
        } 
		// 정렬됨	
        for(int i=0;i<mapkey.length;i++){
            System.out.println(mapkey[i]+" "+testMap.get(mapkey[i]));
        }

Value 기준 정렬

HashMap을 Value로 정렬하기 위해서는 compareTo를 사용한다.

        // value 값 기준 정렬

        HashMap<Integer, Integer> map2 = new HashMap<>();

        map2.put(1, 5);
        map2.put(2, 0);
        map2.put(3, 3);
        map2.put(4, 9);
        map2.put(5, 6);

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

        Collections.sort(list, new Comparator<>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o1.getValue().compareTo(o2.getValue()); // 오름차순
                // return o1.getValue()-o2.getValue(); // 이 방법도 가능
                // return o2.getValue().compareTo(o1.getValue()); // 내림차순
            }
        });

        for(Map.Entry<Integer, Integer> entry : list){
            System.out.println(entry.getKey()+" "+entry.getValue());
        }

(결과)

오름차순 정렬
2 0
3 3
1 5
5 6
4 9

HashMap에 저장된 데이터 값을 Comparator 함수를 사용하여 정렬한다.

TreeMap 자동 정렬

TreeMap은 Key를 기준으로 자동 정렬한다.

        // TreeMap  정렬
        TreeMap<Integer, Integer> tree = new TreeMap<>();

        tree.put(6, 1);
        tree.put(1, 2);
        tree.put(4, 3);
        tree.put(10, 4);
        tree.put(7, 5);


        System.out.println("오름차순 정렬");
        for (Integer key : tree.keySet()) {
            System.out.println(key + " : " + tree.get(key));
        }

(결과)

오름차순 정렬
1 : 2
4 : 3
6 : 1
7 : 5
10 : 4

https://ponyozzang.tistory.com/404

profile
Back-End Developer

0개의 댓글