[자바] 값에 의해지도 키 키의 네 가지 방법의 필수 인수

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) 많은 - 투 -지도 사이의 양방향 관계를 지원하지 않습니다.

방법의 특정 요구에 따라 선택, 선택합니다.


공공 우려 번호에 오신 것을 환영합니다 < 느린 호박 말했다 , 당신이 계속 업데이트됩니다> ...

더 마무리에 비해 더 쓰기, 더 많은 책, 더 공유.

추천

출처www.cnblogs.com/larrydpk/p/11786001.html