[java] 중복 키로 구현 매핑

중복 키가있는지도를 갖고 싶습니다.

많은지도 구현이 있다는 것을 알고 있습니다 (Eclipse는 약 50 개를 보여줍니다). 그래서 이것을 허용하는 것이 있어야합니다. 이 작업을 수행하는 자신의지도를 작성하는 것이 쉽다는 것을 알고 있지만 기존 솔루션을 사용하고 싶습니다.

커먼즈 컬렉션이나 구글 컬렉션에있는 것일까 요?



답변

당신은 멀티 맵을 찾고 있으며, 실제로 commons-collections와 Guava는 여러 가지 구현을 가지고 있습니다. 멀티 맵은 키당 값 컬렉션을 유지하여 여러 키를 허용합니다. 즉, 단일 객체를 맵에 넣을 수 있지만 컬렉션을 검색합니다.

Java 5를 사용할 수 있다면 Multimap제네릭을 인식 하는 Guava를 선호합니다 .


답변

Google 컬렉션 외부 라이브러리에 의존 할 필요가 없습니다. 다음 맵을 간단히 구현할 수 있습니다.

Map<String, ArrayList<String>> hashMap = new HashMap<String, ArrayList>();

public static void main(String... arg) {
   // Add data with duplicate keys
   addValues("A", "a1");
   addValues("A", "a2");
   addValues("B", "b");
   // View data.
   Iterator it = hashMap.keySet().iterator();
   ArrayList tempList = null;

   while (it.hasNext()) {
      String key = it.next().toString();
      tempList = hashMap.get(key);
      if (tempList != null) {
         for (String value: tempList) {
            System.out.println("Key : "+key+ " , Value : "+value);
         }
      }
   }
}

private void addValues(String key, String value) {
   ArrayList tempList = null;
   if (hashMap.containsKey(key)) {
      tempList = hashMap.get(key);
      if(tempList == null)
         tempList = new ArrayList();
      tempList.add(value);
   } else {
      tempList = new ArrayList();
      tempList.add(value);
   }
   hashMap.put(key,tempList);
}

코드를 미세 조정하십시오.


답변

Multimap<Integer, String> multimap = ArrayListMultimap.create();

multimap.put(1, "A");
multimap.put(1, "B");
multimap.put(1, "C");
multimap.put(1, "A");

multimap.put(2, "A");
multimap.put(2, "B");
multimap.put(2, "C");

multimap.put(3, "A");

System.out.println(multimap.get(1));
System.out.println(multimap.get(2));
System.out.println(multimap.get(3));

출력은 다음과 같습니다.

[A,B,C,A]
[A,B,C]
[A]

참고 : 라이브러리 파일을 가져와야합니다.

http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;

또는 https://commons.apache.org/proper/commons-collections/download_collections.cgi

import org.apache.commons.collections.MultiMap;
import org.apache.commons.collections.map.MultiValueMap;


답변

일반 HashMap의 값에 대한 값 배열을 전달하여 중복 키를 시뮬레이션 할 수 있으며 사용할 데이터를 결정하는 것은 사용자에게 달려 있습니다.

중복 키에 대한 아이디어가 마음에 들지 않지만 MultiMap을 사용할 수도 있습니다 .


답변

(주석에 쓴 것처럼) 키-값 쌍 목록에 대해 반복하려면 목록 또는 배열이 더 좋습니다. 먼저 키와 값을 결합하십시오.

public class Pair
{
   public Class1 key;
   public Class2 value;

   public Pair(Class1 key, Class2 value)
   {
      this.key = key;
      this.value = value;
   }

}

Class1 및 Class2를 키 및 값에 사용할 유형으로 바꿉니다.

이제 배열이나 목록에 넣고 반복 할 수 있습니다.

Pair[] pairs = new Pair[10];
...
for (Pair pair : pairs)
{
   ...
}


답변

이 문제는 맵 항목 목록으로 해결할 수 있습니다 List<Map.Entry<K,V>>. 외부 라이브러리 나 새로운 Map 구현을 사용할 필요가 없습니다. 다음과 같이 맵 항목을 만들 수 있습니다.
Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);


답변

commons.apache.org

MultiValueMap class