
Map인터페이스의 한종류, key-value 값으로 데이터를 하나로 묶어 entry로 저장하는 형태이다.
저장은 느리다는 단점이 있다. 하지만, hashing이란 해시함수를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법을 말하는데, hashing을 사용하기 때문에 많은 양의 데이터를 검색하는 데 뛰어난 성능을 보인다. hashMap보다 TreeMap은 저장이 빠르지만 데이터를 가져올 때 느리다.
그렇다면 Map은 어떤 걸까?
Map이란 ("Key", Value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스들을 구현 하는 데 사용되는 것이다.
key값은 중복이 불가능, value는 null값을 포함한 value로 중복이 가능하다.
그래서 데이터와 중복된 키와 값을 저장하면, 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.
멀티쓰레드에서 동시에 HashMap을 건드려 Key-value값을 사용하면 문제가 될 수 있다. 멀티쓰레드에서는 HashMap이라는 것을 사용한다.
숫자로 이루어진 배열인 nums를 인자로 전달합니다.
숫자중에서 과반수(majority, more than a half) 가 넘은 숫자를 반환해주세요.
예를들어,
num[3,2,3]
return 3
nums = [2,2,1,1,1,2,2]
return 2
#가정
nums 배열의 길이는 무조건 2개 이상
import java.util.HashMap;
import java.util.Map.Entry;
class Solution {
public int solution(int[] numbers) {
//key와 value 모두 정수 타입인 HashMap인스턴스를 생성
HashMap<Integer, Integer> map = new HashMap<>();
//for each 문의 구조를 이용해서 numbers에 있는 리스트를 num에 넣어주기
for(int num : numbers) {
try {
map.put(num, map.get(num)+1); //map은 put을 이용해 key, value 저장
// get 메소드를 이용하면 value값에 +1해주기
// why? 해당 key값의 갯수를 세기 위해서
}catch(Exception e) {
map.put(num, 1); //앞에 map에서 갖고온 값이 없을 때 1로 넣어주기
}
}
for(Entry<Integer, Integer> entry: map.entrySet()) {
//entry에 값이 numbers의 수보다 절반이상 초과하면 해당 numbers의 숫자를 리턴시켜준다.
if(entry.getValue() > numbers.length/2) {
return entry.getKey();
}
}
return -1;
}
}
Map에 값을 전체 출력하기 위해서는 entrySet(), keySet() 메소드를 사용하면 되는데 entrySet() 메서드는 key와 value의 값이 모두 필요한 경우 사용하고, keySet() 메서드는 key값만 필요한 경우 사용한다.
참고:) Iterator 인터페이스를 사용할 수 없는 컬렉션인 Map에서 Iterator 인터페이스를 사용하기 위해서는 Map에 entrySet(), KeySet() 메소드를 사용하여 Set객체를 반환 받은 후에 Iterator 인터페이스를 사용하면 된다.
안녕하세요. 글 재미있게 읽었습니다. 다만, map에서 get으로 가져올 때 getOrDefault() 메소드를 사용하면 try-catch 없이 깔끔한 코드를 만들 수 있지 않을까 싶어서 주제넘게 한말씀 올립니다.