1 소개
우리 모두가 알다시피 Map
키가에 저장되는 <Key,Value>
키 값을 알고, 선박, 사용은 Map.get(key)
신속하게 값 값을 얻을 수 있습니다. 그러나 때때로 우리는 가치의 가치를 알고 얻을려면 키 값을 찾아야합니다.
이 문서에서는 키 값을 획득하기 위해 취득한 값을 전달하여 예에 의해 네 가지 방법을 설명한다.
이 네 가지 방법
2.1 라운드 로빈
순환 방법을 찾기 위해 조건을 충족하는 항목, 비교,지도를 탐색하는 것입니다. 삼가지 경우가있을 것입니다 :
(1)의 값을 찾을
(2) 복수의 값을 찾을
(3)을 찾을 수 없습니다
특정 코드는 다음과 같이 :
@Test
public void loop() {
Map<String, Integer> map = ImmutableMap.of("A", 1, "B", 2, "C", 3, "D", 2);
//找到一个值
assertEquals("A", getKeyByLoop(map, 1));
//找到多个值
assertEquals(ImmutableSet.of("B", "D"), getKeysByLoop(map, 2));
//找不到
assertEquals(null, getKeyByLoop(map, 4));
}
private <K, V> K getKeyByLoop(Map<K, V> map, V value) {
for (Map.Entry<K, V> entry : map.entrySet()) {
if (Objects.equals(entry.getValue(), value)) {
return entry.getKey();
}
}
return null;
}
private <K, V> Set<K> getKeysByLoop(Map<K, V> map, V value) {
Set<K> set = Sets.newHashSet();
for (Map.Entry<K, V> entry : map.entrySet()) {
if (Objects.equals(entry.getValue(), value)) {
set.add(entry.getKey());
}
}
return set;
}
말하고 싶습니다 평등 반대로, 사용하는 경우이다 Objects.equals(a, b)
방법이 아닌 a.equals(b)
방법을. 이 널 포인터 예외를 방지 할 수 있습니다.
2.2 트림 방법
Stream
항상 우아하고 직관적 인 접근 방식은 쓰기 쉽고 이해하기 쉬운 설정 작업의 다양한 제공 할 수 있습니다. 필터를 통해, 다음과 같은 조건이 만족 취출 값 같다 :
@Test
public void stream() {
Map<String, Integer> map = ImmutableMap.of("A", 1, "B", 2, "C", 3, "D", 2);
assertEquals(ImmutableSet.of("B", "D"), getKeysByStream(map, 2));
}
private <K, V> Set<K> getKeysByStream(Map<K, V> map, V value) {
return map.entrySet()
.stream()
.filter(kvEntry -> Objects.equals(kvEntry.getValue(), value))
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
}
2.3 구아바 的 BiMap
구글이되어 Guava
제공하는 BiMap
등 양방향지도를 부르는 inverse()
방법은 역 연결을 반환 BiMap
한 후 그들이 할 수있는, get()
키 값 방법을 얻을.
다음과 같이 코드입니다 :
@Test
public void guava() {
BiMap<String, Integer> biMap = HashBiMap.create();
biMap.put("A", 1);
biMap.put("B", 2);
biMap.put("C", null);
biMap.put("D", 4);
assertEquals("D", biMap.inverse().get(4));
}
그 주 BiMap
양방향으로 Map
하고, 그것은 하나 개의 관계를 저장하는 많은 수없는 HashMap
것이 가능하다. 이 양방향이기 때문에 실제로 잘 충족하는, 즉, 이해 Key
고유 값을, 또한 만족하는 Value
값의 고유성. 같은 값 내부에 저장된 경우, 예외가 발생합니다 : java.lang.IllegalArgumentException: value already present
.
2.4 아파치 코 몬즈 컬렉션 的 BidiMap
마찬가지로, Apache Commons Collections
또한 클래스의 양방향지도를 제공 BidiMap
는하지 일대-수 유지하는도. 그것은 제공하는 getKey(value)
키 값을 반환하는 방법을. 다음과 같이 코드입니다 :
@Test
public void apacheCommons() {
BidiMap<String, Integer> bidiMap = new DualHashBidiMap<>();
bidiMap.put("A", 1);
bidiMap.put("B", 2);
bidiMap.put("C", null);
bidiMap.put("D", 4);
assertEquals("D", bidiMap.getKey(4));
}
그리고 구아바의 BiMap
다른는 같은 값을 저장할 때, 그것은 예외를 발생하지만, 원본 데이터를 덮어 쓸 것입니다.
3 요약
이 문서는 값으로지도 키 값의 값을 얻는 네 가지 방법을 설명, 각각 순환 방법, 네 가지 방법과 유사하지만 동일하지 스트림, 구아바, 아파치 코 몬즈 컬렉션.
(1) 순환 방법은 반대의 사용을 권장하지 않는지도 키 값을하는 것이 필요한 경우, 성격 STRAM를 통과하고, 제공되는 구아바 양방향지도 아파치 코 몬즈 고려 될 수있다 사용된다;
당신은 급속한의 조건을 충족하는 키 값을 찾을 수 있지만, (2)지도, 실제로 시간 사고 양방향 공간이지만, 그것은 또한 양방향지도를 저장하기 위해 더 많은 공간을 사용합니다;
(3) 많은 - 투 -지도 사이의 양방향 관계를 지원하지 않습니다.
방법의 특정 요구에 따라 선택, 선택합니다.
공공 우려 번호에 오신 것을 환영합니다 < 느린 호박 말했다 , 당신이 계속 업데이트됩니다> ...
더 마무리에 비해 더 쓰기, 더 많은 책, 더 공유.