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 기본 사용법 보러가기
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 |