Java 맵에서 값에 대한 키 가져 오기

1. 소개

이 빠른 자습서에서는 지정된 값에 대해 맵에서 키를 검색하는 세 가지 다른 접근 방식을 보여줄 것입니다. 또한 다양한 솔루션의 장점과 단점에 대해서도 논의 할 것입니다.

지도 인터페이스 에 대해 자세히 알아 보려면 이 문서를 확인하세요.

2. 반복적 접근

Java CollectionsMap 인터페이스는 entrySet () 라는 메소드를 제공합니다 . Set에 있는지도의 모든 항목 또는 키-값 쌍을 반환합니다 .

아이디어는이 엔트리 세트를 반복하고 값이 제공된 값과 일치하는 키를 반환하는 것입니다.

public  K getKey(Map map, V value) { for (Entry entry : map.entrySet()) { if (entry.getValue().equals(value)) { return entry.getKey(); } } return null; }

그러나 여러 키가 동일한 값을 가리킬 가능성이 있습니다.

이 경우 일치하는 값이 발견되면 키를 Set에 추가 하고 루프를 계속합니다. 결국 원하는 모든 키를 포함 하는 Set 을 반환합니다 .

public  Set getKeys(Map map, V value) { Set keys = new HashSet(); for (Entry entry : map.entrySet()) { if (entry.getValue().equals(value)) { keys.add(entry.getKey()); } } return keys; }

이것은 매우 간단한 구현이지만 몇 번의 반복 후에 모든 일치 항목이 발견 되더라도 모든 항목을 비교합니다.

3. 기능적 접근

Java 8에 Lambda 표현식이 도입됨에 따라보다 유연하고 읽기 쉬운 방식으로이를 수행 할 수 있습니다. 엔트리 세트를 Stream으로 변환하고 주어진 값을 가진 엔트리 만 필터링하기 위해 람다를 제공합니다.

그런 다음 map 메서드를 사용 하여 필터링 된 항목에서 키 스트림 을 반환 합니다.

public  Stream keys(Map map, V value) { return map .entrySet() .stream() .filter(entry -> value.equals(entry.getValue())) .map(Map.Entry::getKey); }

스트림 반환의 장점은 광범위한 클라이언트 요구를 충족시킬 수 있다는 것입니다. 호출 코드에는 제공된 값을 가리키는 키가 하나만 필요하거나 모든 키가 필요할 수 있습니다. 스트림 평가가 느리기 때문에 클라이언트는 요구 사항에 따라 반복 횟수를 제어 할 수 있습니다.

또한 클라이언트는 적절한 수집기를 사용하여 스트림을 임의의 컬렉션으로 변환 할 수 있습니다.

Stream keyStream1 = keys(capitalCountryMap, "South Africa"); String capital = keyStream1.findFirst().get(); Stream keyStream2 = keys(capitalCountryMap, "South Africa"); Set capitals = keyStream2.collect(Collectors.toSet());

4. Apache Commons 컬렉션 사용

위의 아이디어는 특정지도에 대해 함수를 매우 자주 호출해야하는 경우 별로 도움이되지 않습니다 . 불필요하게 키 세트를 반복해서 반복합니다.

이 시나리오에서는 값에 대한 키를 검색하는 데 일정한 시간이 걸리므로 키에 대한 다른 값 맵을 유지하는 것이 더 합리적입니다.

ApacheCommons Collections 라이브러리 는 BidiMap 이라는 양방향 맵을 제공합니다 . 주어진 값에 대한 키를 검색하기위한 getKey () 라는 메소드가 있습니다 .

BidiMap capitalCountryMap = new DualHashBidiMap(); capitalCountryMap.put("Berlin", "Germany"); capitalCountryMap.put("Cape Town", "South Africa"); String capitalOfGermany = capitalCountryMap.getKey("Germany");

그러나 BidiMap 은 키와 값 사이에 1 : 1 관계를 적용합니다 . 값이 이미 에있는 키-값 쌍을 넣으려고 하면 이전 항목이 제거됩니다. 즉, 값에 대해 키를 업데이트합니다.

또한 리버스 맵을 유지하기 위해 더 많은 메모리가 필요합니다.

BidiMap 사용 방법에 대한 자세한 내용 은이 튜토리얼에 있습니다.

5. Google Guava 사용

Google 에서 개발 한 Guava에서 발견 된 BiMap 이라는 또 다른 양방향 지도를 사용할 수 있습니다 . 이 클래스는 메소드 이름을 제공 역 () 값 키 얻을 지도 또는 역 지도를 주어진 값에 따라 키를 가져올 수 :

HashBiMap capitalCountryMap = HashBiMap.create(); capitalCountryMap.put("Berlin", "Germany"); capitalCountryMap.put("Cape Town", "South Africa"); String capitalOfGermany = capitalCountryMap.inverse().get("Germany");

마찬가지로 BidiMap , BiMap는 같은 값을 참조 여러 개의 키를 허용하지 않습니다 . 이러한 시도를 시도하면 java.lang.IllegalArgumentException이 발생 합니다.

말할 것도없이 BiMap 은 내부에 역 맵을 저장해야하기 때문에 상당한 양의 메모리를 사용합니다. BiMap 에 대해 더 알고 싶다면 이 튜토리얼을 확인하세요.

6. 결론

이 간단한 기사에서 우리는 값이 주어진 맵의 키 를 검색하는 몇 가지 방법을 논의했습니다 . 각 접근 방식에는 장단점이 있습니다. 우리는 항상 사용 사례를 고려하고 상황에 따라 가장 적합한 사례를 선택해야합니다.

위 자습서의 전체 소스 코드는 GitHub에서 사용할 수 있습니다.