자바 맵 에 중복 키 저장

30928 단어 Java
1. 개술
본 고 는 맵 의 키 가 여러 개의 value 에 대한 몇 가지 방법 을 소개 한다.JDK 표준 Map 구현 에서 하나의 key 에 여러 개의 value 를 삽입 하려 고 시도 하면 다음 value 는 앞의 value 를 덮어 씁 니 다.
Map<String, String> map = new HashMap<>();
assertThat(map.put("key1", "value1")).isEqualTo(null);
assertThat(map.put("key1", "value2")).isEqualTo("value1");
assertThat(map.get("key1")).isEqualTo("value2");

2. 집합 을 Value 로 한다
하나의 키 가 여러 개의 value 에 대한 상황 을 처리 하려 면 모든 value 를 하나의 집합 에 저장 할 수 있 습 니 다.
Map<String, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<>();
map.put("key1", list);
map.get("key1").add("value1");
map.get("key1").add("value2");
  
assertThat(map.get("key1").get(0)).isEqualTo("value1");
assertThat(map.get("key1").get(1)).isEqualTo("value2");

이런 방식 은 여러 가지 결점 이 있 고 오류 가 발생 하기 쉽다.키 마다 집합 을 만 들 고 집합 이 존재 하 는 지 확인 하고 값 을 추가 하거나 삭제 해 야 합 니 다. 자바 8 에 서 는 컴퓨터 () 방법 으로 코드 를 간소화 할 수 있 습 니 다.
Map<String, List<String>> map = new HashMap<>();
map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value1");
map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value2");
 
assertThat(map.get("key1").get(0)).isEqualTo("value1");
assertThat(map.get("key1").get(1)).isEqualTo("value2");

3. 아파 치 커 먼 즈 컬 렉 션 사용
의존 도 를 높이다
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-collections4</artifactId>
  <version>4.1</version>
</dependency>

3.1 MutiMap
org. apache. comons. collections 4. MultiMap 인 터 페 이 스 는 하나의 Map 을 정의 하고 각 key 는 하나의 집합 에 대응 합 니 다.
MultiMap<String, String> map = new MultiValueMap<>();
map.put("key1", "value1");
map.put("key1", "value2");
assertThat((Collection<String>) map.get("key1"))
  .contains("value1", "value2");

이러한 비 스 레 드 보안 은 4.1 버 전에 서 폐기 되 었 습 니 다.
3.2 MultiValuedMap
org. apache. comons. collections 4. MultiValued Map 이라는 인 터 페 이 스 는 Array ListValued HashMap 과 HashSetValued HashMap 등 여러 가지 실현 이 있 습 니 다.
사용 방식 은 다음 과 같 습 니 다.
MultiValuedMap<String, String> map = new ArrayListValuedHashMap<>();
map.put("key1", "value1");
map.put("key1", "value2");
map.put("key1", "value2");
assertThat((Collection<String>) map.get("key1"))
  .containsExactly("value1", "value2", "value2");

MultiValuedMap<String, String> map = new HashSetValuedHashMap<>();
map.put("key1", "value1");
map.put("key1", "value1");
assertThat((Collection<String>) map.get("key1"))
  .containsExactly("value1");

value 중복 을 원 하지 않 는 다 면 HashSetValued HashMap 을 사용 할 수 있 습 니 다.
MultiValuedMap<String, String> map = new HashSetValuedHashMap<>();
map.put("key1", "value1");
map.put("key1", "value1");
assertThat((Collection<String>) map.get("key1"))
  .containsExactly("value1");

그러나 Array ListValued HashMap, HashSetValued HashMap 및 HashSetValued HashMap 은 모두 라인 이 안전 하지 않 습 니 다.스 레 드 안전 을 위해 Unmodifieble MultiValuedMap 을 사용 할 수 있 습 니 다.
@Test(expected = UnsupportedOperationException.class)
public void givenUnmodifiableMultiValuedMap_whenInserting_thenThrowingException() {
    MultiValuedMap<String, String> map = new ArrayListValuedHashMap<>();
    map.put("key1", "value1");
    map.put("key1", "value2");
    MultiValuedMap<String, String> immutableMap =
      MultiMapUtils.unmodifiableMultiValuedMap(map);
    immutableMap.put("key1", "value3");
}

4.Guava Multimap
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>23.0</version>
</dependency>

4.1 LinkedHashMultimap
이 종 류 는 삽입 순서에 따라 삽입 요 소 를 저장 합 니 다.
Multimap<String, String> map = LinkedHashMultimap.create();
map.put("key1", "value3");
map.put("key1", "value1");
map.put("key1", "value2");
assertThat((Collection<String>) map.get("key1"))
  .containsExactly("value3", "value1", "value2");

4.2 TreeMultimap
이 종 류 는 삽 입 된 요 소 를 자연 순서에 따라 접근 할 수 있 습 니 다.
Multimap<String, String> map = TreeMultimap.create();
map.put("key1", "value3");
map.put("key1", "value1");
map.put("key1", "value2");
assertThat((Collection<String>) map.get("key1"))
  .containsExactly("value1", "value2", "value3");

5. 사용자 정의 MultiMap
Guava 를 사용 하면 Multimap. new Multimap () 를 사용 하여 맵 을 맞 출 수 있 습 니 다.
6. 총화
한 쌍 의 다 중 사 고 는 집합 을 통 해 요 소 를 저장 하 는 것 입 니 다. guava 와 apache collection 은 우리 에 게 기 존의 도 구 를 제공 합 니 다. 사용자 정의 하려 면 guava 가 제공 하 는 확장 방법 을 사용 하여 실현 할 수 있 습 니 다.
주소
https://www.baeldung.com/java-map-duplicate-keys

좋은 웹페이지 즐겨찾기