문제

구아바에서는 가능할까요?

  1. 역방향 조회를 수행하려면 BiMap 키와 다중 값에 대해?정확하게는 키와 해당하는 여러 값이 있는데 값에서 키를 가져오고 싶습니다.

  2. 여러 값을 저장하려면 LinkedHashMap?정확하게는 키 - 여러 값을 어떤 순서로 저장하고 싶기 때문에 목록에서 키 위치를 얻을 수 있습니다.

도움이 되었습니까?

해결책

광고. 1. 예, BiMap<K, V> inverse BiMap view> 을 입력하십시오.

예제 (Guava의 테스트 스위트에서 가져온) :

public void testMapConstructor() {
  /* Test with non-empty Map. */
  Map<String, String> map = ImmutableMap.of(
      "canada", "dollar",
      "chile", "peso",
      "switzerland", "franc");
  HashBiMap<String, String> bimap = HashBiMap.create(map);
  assertEquals("dollar", bimap.get("canada"));
  assertEquals("canada", bimap.inverse().get("dollar"));
}
.


광고. 2. "을 의미한다고 가정합니다. 키 -> 여러 [컬렉션] 값" (BiMap<V, K>), BiMap 가 원하는대로, 더 정확하게 Map<K, Collection<V>> (값 주문 보존) 또는 ListMultimap 보존 및 값 주문). 객체가 변경할 수없는 경우, ArrayListMultimap .

factory (비트 verbose), 즉 사용 :

private static <K, V> ListMultimap<K, V> makeLinkedArrayListMultimap() {
  return Multimaps.newListMultimap(Maps.<K, Collection<V>>newLinkedHashMap(), 
      new Supplier<List<V>>() {
        @Override public List<V> get() {
          return Lists.newArrayList();
        }
      });
}

public static void main(final String[] args) {
  final ListMultimap<String, String> multimap = makeLinkedArrayListMultimap();
  multimap.putAll("one", ImmutableList.of("zero", "three"));
  multimap.putAll("two", ImmutableList.of("three", "four", "three"));
  multimap.putAll("three", ImmutableList.<String>of()); // note that this doesn't add key to multimap
  multimap.put("four", "forty-two");

  System.out.println(multimap);
  // prints {one=[one, three], two=[three, four, three], four=[forty-two]}

  final List<String> listForOnes = multimap.get("one");
  System.out.println(listForOnes.get(0));
  // prints zero
}
.


ps 구아바의 위키 < / a> ImmutableListMultimapMultimap를 모두 설명합니다.

다른 팁

구아바에서 가장 가까운 것은 Multiset 키에 여러 값을 매핑 할 수 있지만 요구 사항을 충족시킬 수 있습니다.

  1. 가치를 사용하여 키를 찍는 것이 좋습니다 (단일 키에 매핑 된 여러 값을 맵핑 할 때) 값을 사용하여 키를 찍는 것이 좋습니다.고유 한 가치를 갖도록 보장하십시오.
  2. Guava와의 다른 옵션은 Map<Key, Collection<Value> reverse 맵핑 (값 -> 키)을 제공 할 수 있지만 동일한 키에 여러 값을 매핑해야하기 때문에 이것은 또한 좋은 적합성이 아닙니다.

처럼 @Xaerxess 에서 말한다 그의 대답 두 번째 질문은 직접 만들 수 있습니다. ListMultimap 이는 LinkedHashMap 을 사용하여 백업 맵으로 Multimaps.newListMultimap 방법.

첫 번째 질문의 경우 여러 값에 매핑된 키가 있는 경우(예:ㅏ Multimap), 다음 방법을 사용할 수 있습니다. Multimaps.invertFrom 원본의 반전된 복사본을 만들려면 Multimap 역방향 조회를 수행합니다.또한 ImmutableListMultimap 원본을 복사해서 사용하세요 inverse() 역을 얻는 방법은 다음과 같이 원본을 복사하는 것입니다. Multimaps.invertFrom (하지만 캐시하므로 다음을 반복해서 호출합니다.) inverse() 동일한 사본을 반환합니다.)

추가 메모리 소비에 신경 쓰지 않고, 여러 역방향 조회를 수행하고, 생성 후 원본에 대한 변경 사항을 최신 상태로 유지하기 위해 역 복사본이 필요하지 않은 경우 이는 가치가 있을 수 있습니다. .하나의 특정 값에 매핑되는 키만 조회하려는 경우 전체 복사본을 만들지 않고도 항목을 한 번 반복하여 검색할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top