logo

자바 8 멀티맵

Java는 다양하고 유용한 내장 컬렉션 라이브러리를 제공합니다. 그러나 때로는 Java 표준 라이브러리에 내장되어 있지 않은 특별한 유형의 컬렉션이 필요할 때도 있습니다. 이 컬렉션 중 하나는 멀티맵 . 이번 시간에는 멀티맵과 멀티맵이 무엇인지 알아보겠습니다. Java에서 멀티맵을 구현하는 방법 그리고 멀티맵 인터페이스 구아바 도서관의 모습입니다.

자바 멀티맵

자바에서는 지도 키를 값으로 매핑할 수 있는 데이터 구조입니다. 반면, 멀티맵은 단일 키를 여러 값(예: DBMS의 일대다 관계)에 매핑할 수 있는 Guava 라이브러리에 있는 새로운 컬렉션 유형입니다. 그러나 JDK는 다중 매핑을 허용하지 않습니다.

자바 8 멀티맵

Google의 Guava 라이브러리 및 Apache Commons Collections 라이브러리를 사용하여 Java에서 멀티맵을 구현하는 대체 솔루션입니다. 둘 다 Multimap 인터페이스 구현을 제공합니다. 단일 키에 대해 둘 이상의 값을 저장할 수 있습니다. 컬렉션에 저장되고 대안으로 간주되는 키와 값 모두 지도 또는 지도 (표준 JDK 컬렉션 프레임워크).

자바에서 지도 반복하기

하지만 Google Guava 라이브러리의 Multimap을 사용하는 것은 우리에게 별로 도움이 되지 않습니다. 대신에 적절하게 사용자 정의할 수 있는 자체 Multimap 클래스를 Java로 구현하겠습니다. Java로 Multimap 클래스를 작성하는 것은 쉽습니다.

다음 Java 프로그램은 맵과 컬렉션을 사용하여 Java에서 Multimap 클래스를 구현하는 방법을 보여줍니다.

Java 멀티맵 구현

MultimapExample.java

이진 트리 vs 이진 검색 트리
 import java.util.*; class MultiMap { //creating a map of key and value (collection) private Map<k, collection> map = new HashMap(); //add the specified value with the specified key in this multimap public void put(K key, V value) { if (map.get(key) == null) { map.put(key, new ArrayList()); } map.get(key).add(value); } //associate the specified key with the given value if not already associated with a value public void putIfAbsent(K key, V value) { if (map.get(key) == null) { map.put(key, new ArrayList()); } // if the value is absent, insert it if (!map.get(key).contains(value)) { map.get(key).add(value); } } //the method returns the Collection of values to which the specified key is mapped, or null if this multimap contains no mapping for the key public Collection get(Object key) { return map.get(key); } //the method returns a set view of the keys contained in this multimap public Set keySet() { return map.keySet(); } //the method returns a set view of the mappings contained in this multimap public Set<map.entry<k, collection>&gt; entrySet() { return map.entrySet(); } //the method returns a Collection view of Collection of the values present in this multimap public Collection<collection> values() { return map.values(); } //Returns true if this multimap contains a mapping for the specified key. public boolean containsKey(Object key) { return map.containsKey(key); } //Removes the mapping for the specified key from this multimap if present and returns the Collection of previous values associated with the key, or null if there was no mapping for key public Collection remove(Object key) { return map.remove(key); } //Returns the total number of key-value mappings in this multimap. public int size() { int size = 0; for (Collection value: map.values()) { size += value.size(); } return size; } //Returns true if this multimap contains no key-value mappings. public boolean isEmpty() { return map.isEmpty(); } //Removes all the mappings from this multimap. public void clear() { map.clear(); } //Removes the entry for the specified key only if it is currently mapped to the specified value and returns true if removed public boolean remove(K key, V value) { if (map.get(key) != null) // key exists return map.get(key).remove(value); return false; } //Replaces the entry for the specified key only if currently mapped to the specified value and return true if replaced public boolean replace(K key, V oldValue, V newValue) { if (map.get(key) != null) { if (map.get(key).remove(oldValue)) { return map.get(key).add(newValue); } } return false; } } //main class public class MultimapExample { //main method public static void main(String args[]) { //Creating a multimap of type String MultiMap multimap = new MultiMap(); //adding values to the multimap multimap.put(&apos;a&apos;, &apos;Andrew&apos;); multimap.put(&apos;b&apos;, &apos;Albert&apos;); multimap.put(&apos;b&apos;, &apos;Tom&apos;); multimap.put(&apos;d&apos;, &apos;Sam&apos;); multimap.put(&apos;d&apos;, &apos;Reo&apos;); multimap.put(&apos;g&apos;, &apos;Jack&apos;); multimap.put(&apos;g&apos;, &apos;David&apos;); System.out.println(&apos;----- Printing Multimap using keySet -----
&apos;); //loop iterate over multimap for (String lastName: multimap.keySet()) { //printing key and values System.out.println(lastName + &apos;: &apos; + multimap.get(lastName)); } } } </collection></map.entry<k,></k,>

산출:

 ----- Printing Multimap using keySet ----- a: [Andrew] b: [Albert, Tom] d: [Sam, Reo] g: [Jack, David] 

Google의 Guava 라이브러리 사용

멀티맵 인터페이스는 다음에 정의되어 있습니다. com.google.common.collect Guava 라이브러리 패키지입니다. 다음과 같은 이름의 많은 클래스를 구현합니다.

ArrayListMultimap, ForwardingListMultimap, ForwardingMultimap, ForwardingSetMultimap, ForwardingSortedSetMultimap, HashMultimap, ImmutableListMultimap, ImmutableMultimap, ImmutableSetMultimap, LinkedHashMultimap, LinkedListMultimap, TreeMultimap.

통사론:

 @GwtCompatible public interface Multimap 

키를 값에 매핑하는 컬렉션(Map과 동일)이지만 각 키는 여러 값과 연결될 수 있습니다. 키에서 비어 있지 않은 값 컬렉션에 대한 맵으로 멀티맵의 내용을 시각화할 수 있습니다. 예를 들어:

arp-a 명령
  • 엑스 → 1, 2
  • 와이 → 3

또는

  • 엑스 → 1
  • 엑스 → 2
  • 와이 → 3

Java 멀티맵 인터페이스 방법

방법 설명
asMap() 이는 이 멀티맵의 뷰를 각 고유 키의 맵으로 해당 키와 연관된 값의 비어 있지 않은 컬렉션으로 반환합니다.
분명한() 멀티맵에서 모든 키-값 쌍을 제거하고 비워 둡니다.
containEntry(객체 키, 객체 값) 이 멀티맵에 키와 값이 포함된 키-값 쌍이 하나 이상 포함되어 있으면 true를 반환합니다.
containKey(객체 키) 이 멀티맵에 키와 함께 하나 이상의 키-값 쌍이 포함되어 있으면 true를 반환합니다.
containValue(객체 값) 이 멀티맵에 해당 값이 포함된 키-값 쌍이 하나 이상 포함되어 있으면 true를 반환합니다.
항목() 이 멀티맵에 포함된 모든 키-값 쌍의 뷰 컬렉션을 Map.Entry 인스턴스로 반환합니다.
같음(객체 obj) 지정된 개체가 이 멀티맵과 동일한지 비교합니다.
forEach(BiConsumer 작업) 이 멀티맵에 포함된 모든 키-값 쌍에 대해 지정된 작업을 수행합니다.
get(K 키) 이 멀티맵의 키와 연관된 값이 있는 경우 뷰 컬렉션을 반환합니다.
해시 코드() 이 멀티맵에 대한 해시 코드를 반환합니다.
비었다() 이 멀티맵에 키-값 쌍이 없으면 true를 반환합니다.
키() 중복을 축소하지 않고 이 멀티맵의 각 키-값 쌍의 키를 포함하는 뷰 컬렉션을 반환합니다.
키세트() 이 멀티맵에 포함된 모든 고유 키의 뷰 컬렉션을 반환합니다.
put(K 키, V 값) 이 멀티맵에 키-값 쌍을 저장합니다.
putAll(K 키, 반복 가능한 값) 이는 각 값에 대해 이 멀티맵에 키-값 쌍을 저장하며 모두 동일한 키인 키를 사용합니다.
putAll(멀티맵 멀티맵) multimap.entries()에서 반환된 순서대로 이 멀티맵에 멀티맵의 모든 키-값 쌍을 저장합니다.
제거(객체 키, 객체 값) 이 멀티맵에서 키와 값이 있는 단일 키-값 쌍(있는 경우)을 제거합니다.
RemoveAll(객체 키) 키와 관련된 모든 값을 제거합니다.
replacementValues(K 키, 반복 가능한 값) 동일한 키를 사용하여 값 컬렉션을 저장하고 해당 키에 대한 기존 값을 대체합니다.
크기() 이 멀티맵의 키-값 쌍 수를 반환합니다.
값() 중복 항목을 축소하지 않고(그래서 value().size() == size()) 이 멀티맵에 포함된 각 키-값 쌍의 값을 포함하는 뷰 컬렉션을 반환합니다.