使用重复键映射实现

IAd*_*ter 105 java duplicates multimap guava

我想要一张带有重复键的地图.

我知道有很多地图实现(Eclipse向我展示了大约50个),所以我敢打赌必须有一个允许这个.我知道编写自己的地图很容易做到这一点,但我宁愿使用一些现有的解决方案.

也许在commons-collections或google-collections中有什么东西?

nd.*_*nd. 86

您正在搜索多图,事实上,两个公共集合和Guava都有多个实现.Multimaps通过维护每个键的值集合来允许多个键,即您可以将单个对象放入映射中,但是您可以检索集合.

如果你可以使用Java 5,我宁愿选择Guava,Multimap因为它是泛型的.

  • 请注意,Google Collections已被Guava取代,因此这里是Guava版MultiMap的链接:https://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained#Multimap (7认同)
  • 此外,这个Multimap并不像Apache那样伪装成Map. (3认同)

use*_*943 32

我们不需要依赖Google Collections外部库.您可以简单地实现以下Map:

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);
}
Run Code Online (Sandbox Code Playgroud)

请确保微调代码.

  • 当然,您不需要依赖Guava的Multimap.它只是简化了你的生活,因为你不必重新实现它们,测试它们等等. (13认同)
  • 编写基本代码并不总是那么聪明。谷歌更有可能有更好的测试 (2认同)

Iss*_*aji 25

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));
Run Code Online (Sandbox Code Playgroud)

输出是:

[A,B,C,A]
[A,B,C]
[A]
Run Code Online (Sandbox Code Playgroud)

注意:我们需要导入库文件.

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

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
Run Code Online (Sandbox Code Playgroud)

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

import org.apache.commons.collections.MultiMap;
import org.apache.commons.collections.map.MultiValueMap;
Run Code Online (Sandbox Code Playgroud)

  • 好建议,因为我在我的项目中使用 Spring,所以我最终使用了文档中提到的 MultiValueMap 的 Spring 风格 [http://docs.spring.io/spring-framework/docs/current/javadoc-api/org /springframework/util/MultiValueMap.html](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/MultiValueMap.html) (2认同)

Alb*_*oPL 17

您可以简单地在常规HashMap中传递值的数组,从而模拟重复键,由您决定使用哪些数据.

您也可以使用MultiMap,虽然我不喜欢自己重复键的想法.


Mne*_*nth 10

如果你想迭代一个键值对列表(正如你在注释中写的那样),那么List或数组应该更好.首先结合您的键和值:

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

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

}
Run Code Online (Sandbox Code Playgroud)

将Class1和Class2替换为要用于键和值的类型.

现在您可以将它们放入数组或列表中并迭代它们:

Pair[] pairs = new Pair[10];
...
for (Pair pair : pairs)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下使用List.第二个样本更改为List <Pair>对= new List <Pair>(); for循环保持不变.您可以使用此命令添加一对:pairs.add(pair); (2认同)

Rav*_*ekh 5

commons.apache.org

MultiValueMap class
Run Code Online (Sandbox Code Playgroud)


Tha*_*Van 5

可以使用映射条目列表来解决此问题List<Map.Entry<K,V>>.我们既不需要使用外部库也不需要使用Map的新实现.可以像这样创建一个映射条目: Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);