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 하였다.
'Java' 카테고리의 다른 글
컬렉션 프레임워크 : List < ArrayList, Vector, LinkedList, Stack > (0) | 2021.03.31 |
---|---|
Scanner 사용 nextInt() / nextLine() / next() (0) | 2021.03.30 |
컬렉션 프레임워크 : Set < HashSet, TreeSet, LinkedHashSet > (0) | 2021.01.13 |
ArrayList<> 안에 ArrayList<> : 이차원 배열 (0) | 2020.09.20 |
StringTokenizer & StringBuilder & StringBuffer (0) | 2020.09.20 |