자바생
article thumbnail
Published 2021. 1. 13. 18:05
컬렉션 프레임워크 : Map Java
728x90

Map 인터페이스를 구현하는 클래스

- 대표적으로 HashMap, LinkedHashMap, TreeMap이 있다.

 

Map 특징

- map은 key와 value로 이루어져 있고, 두 개의 값이 한 쌍의 데이터로 이루어져 있다. 예를 들어 key에는 이름 value에는 홍길동 이런 식으로 한 쌍의 데이터가 저장되어있다.

- 중복을 허용하지 않는다. 

 

Map 공통 메소드

boolean containsKey(Object key)

- map이 특정 key값을 가지고 있으면 true 리턴

 

boolean containsValue(Object value)

- map이 특정 value값을 가지고 있으면 true 리턴

 

V get(Object key)

- key에 해당하는 value값을 리턴한다. 만약에 key값이 존재하지 않으면 null 반환

 

boolean isEmpty()

- 데이터가 없으면 true 리턴

 

Set <K> keySet()

- map이 포함하고 있는 key값을 Set 형태로 나타낸다.

 

V put(K key, V value)

- map에 데이터를 삽입

 

V remove(Object key)

- key에 해당하는 value값을 삭제

 

int size()

- map의 데이터 개수를 리턴

HashMap

가장 일반적으로 쓰이는 Map 컬렉션이다. 

순서가 보장되지 않는다.

ex) Map<key, value> map = new HashMap<key, value>();  

형태이다.

 

TreeMap

HashMap과 다른 점은 데이터의 정렬이 존재한다. 정렬 기준은 키 기준 숫자 > 알파벳 대문자 > 소문자 > 한글 순이다. 

ex) a b 1 2 가 나 A B 일 경우,

1 2 A B a b 가 나로 정렬이 된다.

 

LinkedHashMap

TreeMap과 비슷하지만 미세한 차이가 있다. LinkedList 저장된다.

입력 순서가 의미 있다면 LinkedHashMap을, 키 값이 일정한 수준대로 정렬하고 싶은 경우는 TreeMap을 사용한다. 

하지만 두 클래스 모두, O(n)이기 때문에 많은 데이터를 넣을 경우 성능이 좋지 않을 수도 있다.

따라서 웬만하면 O(1)인 HashMap을 이용하는 것이 좋다. 

 

문제 적용

Q. 한 문장에 중복되는 숫자가 몇 개 있냐 이런 문제가 있다고 생각해보자.

A. hash.containsKey(숫자)를 이용해서 true가 나오면 hash.get(숫자)의 값에서 +1을 해주면 되고,

false가 나오면 hash.put(숫자, 1); 하여 찾으면 된다. 물론 임시로 데이터를 저장하는 곳이 있어야 한다. 

 

Map.entry

백준 문제를 풀다가 Map에 있는 값들을 정렬하는 문제를 보았다.

1302 베스트셀러 문제로, <String, Integer>로 map을 만들었는데, Integer 크기 순으로 오름차순하고, 같으면 사전 순으로 정렬하는 것이다. 일반적으로 Map인터페이스는 key값을 가져올 수 있어서 value값을 어떻게 정렬하는지 구글링을 해보았다.

그래서 공식 문서를 보니까 Map.entry라는 인터페이스가 있다. Map.entry는 Map의 nested classes이다. 

이 인터페이스에는 getKey, getValue 메소드가 존재하였다. 그래서 key와 value값 모두 사용할 수 있다.

 

sort를 사용하기 위해서는 해당 Map.Entry를 list로 구현하여 sorting 하였다.

 

 

 

 

728x90
profile

자바생

@자바생

틀린 부분이 있다면 댓글 부탁드립니다~😀

검색 태그