자바 맵 에 중복 키 저장
30928 단어 Java
본 고 는 맵 의 키 가 여러 개의 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.