HashMap, LinkedHashMap에서 value로 key를 찾을 때 사용하는 방법입니다.
1. map을 반복하면서 값 찾기
모든 엔트리를 확인해야하므로 실행 시간이 오래 걸립니다.
HashMap<String, Integer> map = new HashMap<>();
map.put("a" , 100);
map.put("b" , 200);
map.put("c" , 300);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if(entry.getValue() == 100){
return entry.getKey();
}
}
2. key와 value를 바꾼 map생성
첫번째 방법보다 빠르게 key를 찾을 수 있지만, 두 개의 hashmap을 유지해야한다는 단점이 있습니다.
1) 모든 key의 value가 다를 경우
HashMap<String, Integer> orgMap = new HashMap<>();
orgMap.put("key1", 10);
orgMap.put("key2", 20);
orgMap.put("key3", 30);
HashMap<Integer, String> switchMap = new HashMap<>();
for (Map.Entry<String, Integer> entry : orgMap.entrySet()) {
switchMap.put(entry.getValue(), entry.getKey());
}
switchMap.get(10) //"key1"
2) value가 같은 key가 여러개 있는 경우
HashMap에서 동일한 키를 중복으로 저장할 수 없기 때문에 value를 리스트나 집합(Set)형태로 저장합니다.
HashMap<String, Integer> orgMap = new HashMap<>();
orgMap.put("key1", 10);
orgMap.put("key2", 20);
orgMap.put("key3", 30);
orgMap.put("key4", 30);
HashMap<Integer, List<String>> switchMap = new HashMap<>();
for (Map.Entry<String, Integer> entry : orgMap.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
//값이 이미 존재한다면 해당 값을 가지는 리스트에 키를 추가하고, 값이 없다면 새로운 리스트 생성하여 추가
switchMap.computeIfAbsent(value, k -> new ArrayList<>()).add(key);
}
switchMap.get(30) // [key3, key4]
Java8 이후 버전에서 Stream API사용
HashMap<String, Integer> orgMap = new HashMap<>();
orgMap.put("key1", 10);
orgMap.put("key2", 20);
orgMap.put("key3", 30);
orgMap.put("key4", 30);
// 값을 그룹화하여 리스트로 저장
Map<Integer, List<String>> groupedMap = orgMap.entrySet()
.stream()
.collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
// 값을 찾는 방법
List<String> returnKey = groupedMap.get(30); //[key3, key4]
key로 value를 찾을 때는 map.get(key) 를 사용하면 간단합니다.
기본 사용법은 아래 포스팅을 참고해주세요.
👉[JAVA] Java HashMap, LinkedHashMap 기본 사용법 보러가기
[JAVA] Java HashMap, LinkedHashMap, TreeMap
Map key와 value로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조 HashMap Map 인터페이스를 상속하여 Map의 성질을 그대로 가지고 있음 많은 양의 데이터를 검색하는데 뛰어난 성능을 보임
jiyoon-dev.tistory.com
728x90
'Java' 카테고리의 다른 글
[Java] equals NullPointerException(NPE) 다루기 (0) | 2023.08.11 |
---|---|
[Java] LocalDate 비교 (0) | 2023.08.10 |
[JAVA] Set과 Map의 차이 (0) | 2023.07.27 |
[JAVA] Java HashMap, LinkedHashMap, TreeMap (0) | 2023.02.16 |
[JAVA] 자바 TreeMap 사용하기 (0) | 2023.02.16 |