Language/Java

[JAVA] Map.Entry

DuL2 2023. 4. 21. 15:17

Map.Entry 정리

 코테 귤 고르기 풀이 도중 각 귤 별 크기에 따른 갯수를 저장할 컬렉션이 필요했고, key-value 쌍으로 저장할 필요성에 따라 HashMap을 사용했다. 하지만 hashMap은 순서가 없으므로 List에 넣어 정렬을 해보려고 했다.

 

 정렬의 기준은 map의 value(귤의 갯수)이었고, Map을 사용한지 오래되어 기억이 안났고, 풀이 후 포스팅에 정리하게 되었다. 정확히는 풀이를 위해 Map을 사용한 것이 아니라 Map을 구성하는 Entry를 순서 정렬이 가능한 리스트에 담아 풀었다.

 

Map.Entry 란

Map.Entry 인터페이스는 Map 인터페이스의 내부 인터페이스(inner interface)를 말한다. Entry는 Key-Value 쌍의 데이터를 정리하여 다루기 위해 내부적으로 정의된 인터페이스이다. 따라서 Map을 구현하는 클래스는 Map.Entry도 함께 구현해야 한다.

 

자바 공식 문서에서는 이렇게 Key-Value로 구성되는 데이터를 매핑(mapping) 또는 엔트리(entry)라고 기술하고 있다.

 

Map.Entry 주요 메서드

메소드  설명
boolean equals(Object o) 동일한 Entry 인지 비교한다.
Object getKey() Entry의 key 객체를 반환한다.
Object getValue() Entry 의 value 객체를 반환한다.
int hashCode() Entry 의 해시코드를 반환한다.
Object setValue(Object value) Entry의 value 객체를 지정된 객체로 변경한다.

 

Map.entrySet() 메서드

 Key-Value로 이루어진 엔트리 객체를 쉽게 얻을 수 있는 메서드가 Map의 entrySet() 메서드이다. 메서드 이름을 보면 유추할 수 있듯 엔트리(entry)를 Set에 담아 반환해준다.

 

 이렇게 사용하는 이유는 Map에서 keySet()을 이용해 모든 key를 불러온뒤 하나하나 value를 뒤져가며 찾는 과정은 많은 자원이 소모되기 떄문에 데이터 자체를 받아와서 필요한 상태로 커스터마이징하여 사용한다고 이해했다.

 

 entrySet도 Iterator가 필요하다면 자체 내장 메서드로 iterator를 만들어 사용할 수 있다.

 

튜플

Map.Entry는 Key-Value의 데이터를 가지고 있으므로 두 가지 요소를 담는 튜플이라고 볼 수 있다. 따라서, 문제를 풀 때 튜플을 담은 List를 만들고 반복문과 entry.getKey(), entry.getValue() 메서드를 활용한다면 value 값에 따른 정렬이 가능하다.

 

Value값에 따른 정렬

class Solution {
    public int solution(int k, int[] tangerine) {
        int answer = 0;

        Map<Integer, Integer> map = new HashMap<>();
        for (int sizeOfTang : tangerine) {
            map.put(sizeOfTang, map.getOrDefault(sizeOfTang, 0) + 1);
        }

        List<Map.Entry<Integer, Integer>> mapList = new LinkedList<>(map.entrySet());

        mapList.sort((i1, i2) -> map.get(i2.getKey()) - map.get(i1.getKey()));

        for(Map.Entry<Integer, Integer> entry : mapList){
            answer++;
            k -= entry.getValue();
            if (k <= 0) {
                break;
            }
        }

        return answer;
    }
}

[프로그래머스 - JAVA] level 2 - 귤 고르기 코드

 

GitHub - Moveuk/TIL: Repository for TIL(Today I Learned)

Repository for TIL(Today I Learned). Contribute to Moveuk/TIL development by creating an account on GitHub.

github.com

 

 

참고

'Language > Java' 카테고리의 다른 글

[JAVA] 스트림(Stream) - 가공  (0) 2023.03.10
[JAVA] 스트림(Stream)  (0) 2023.03.03
[Java] Static, Heap, Stack  (0) 2022.10.18
JAVA - Enum 파헤치기  (0) 2022.07.26
JVM 정리하기!  (0) 2022.07.24