HashMap:一个键,多个值

82

我怎样才能获取此映射中第一个键的第三个值?这是否可能?


我可以使用HashMap :: get的成员函数获取键的第一个值,但是第三个呢?不幸的是,我找不到任何代码。 - Sunscreen
2
你找不到自己的代码?这就是他所说的。 - Bhesh Gurung
1
好像您对键和哈希键的区别有些困惑。希望这可以为您将事情搞清楚:http://en.wikipedia.org/wiki/Hashmap - vaughandroid
4
一个 Map 不能有一个键对应多个值,但你可以将一个 Collection 作为值来存储。 - Nathan Q
15个回答

105

有库可以实现此功能,但最简单的纯Java方法是创建一个像这样的MapList

Map<Object,ArrayList<Object>> multiMap = new HashMap<>();

4
然而,使用一个库可能比自己编写、测试等更简单。 - Jon Skeet
只有当ArrayList中的对象属于相同类型时,此解决方案才能起作用。例如,不可能同时具有int和double值的键。 - lydiaP
@JonSkeet,这种情况下推荐使用哪个库? - Gaurav
1
@gaurav:自从我离开Java世界以来已经过了很长时间,我不太确定。不过我会看看Guava库。 - Jon Skeet

35

看起来你正在寻找一个多重映射表 (multimap) 。Guava 有各种不同的 Multimap 实现,通常是通过 Multimaps 类创建的。

我建议使用这个实现可能会比自己编写更简单,因为你需要弄清楚 API 应该是什么样子的,仔细检查是否存在列表等。如果你的情况特别反感第三方库,那么可能值得这样做,但否则 Guava 是一个很棒的库,它可能也会帮助你处理其他代码 :)


Apache Commons Collections 还有一个 Multimap 实现。 - Robert
Apache Commons的MultiMap更新链接为:http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/MultiMap.html - Joarder Kamal
两个坏链接,呵呵。 - GC_
@GC_:嗯,是的,这篇文章已经快9年了。这种情况很常见。很容易解决,不需要“哈哈大笑”。(或者你是指Apache commons的那些?如果是的话,与其笑,我仍然认为更有建设性的回应是发布新链接:MultiMap - Jon Skeet

26
例如:
Map<Object,Pair<Integer,String>> multiMap = new HashMap<Object,Pair<Integer,String>>();

其中 Pair 是一个参数化类

public class Pair<A, B> {
    A first = null;
    B second = null;

    Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }

    public A getFirst() {
        return first;
    }

    public void setFirst(A first) {
        this.first = first;
    }

    public B getSecond() {
        return second;
    }

    public void setSecond(B second) {
        this.second = second;
    }

}

13

我在一个类似的问题答案中发现了这个。

Map<String, List<String>> hm = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
values.add("Value 1");
values.add("Value 2");
hm.put("Key1", values);

// to get the arraylist
System.out.println(hm.get("Key1"));

结果:[数值1,数值2]


System.out.println(hm.get("Key1")); - Snowbases

12

标准的 Java HashMap 无法为每个键存储多个值,任何新添加的条目都会覆盖之前的条目。


10

你有类似这样的东西吗?

HashMap<String, ArrayList<String>>

如果是这样,你可以遍历ArrayList,使用arrayList.get(i)获取你需要的项。


3
如何向ArrayList添加元素并进行迭代 - user3504024

7

我是通过随机搜索发现这篇博客的,我认为这会对以下问题有所帮助:http://tomjefferys.blogspot.com.tr/2011/09/multimaps-google-guava.html

public class MutliMapTest {
public static void main(String... args) {
   Multimap<String, String> myMultimap = ArrayListMultimap.create();

   // Adding some key/value
   myMultimap.put("Fruits", "Bannana");
   myMultimap.put("Fruits", "Apple");
   myMultimap.put("Fruits", "Pear");
   myMultimap.put("Vegetables", "Carrot");

   // Getting the size
   int size = myMultimap.size();
   System.out.println(size);  // 4

   // Getting values
   Collection<String> fruits = myMultimap.get("Fruits");
   System.out.println(fruits); // [Bannana, Apple, Pear]

   Collection<string> vegetables = myMultimap.get("Vegetables");
   System.out.println(vegetables); // [Carrot]

   // Iterating over entire Mutlimap
   for(String value : myMultimap.values()) {
      System.out.println(value);
   }

   // Removing a single value
   myMultimap.remove("Fruits","Pear");
   System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear]

   // Remove all values for a key
   myMultimap.removeAll("Fruits");
   System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!)
}
}

最好和最简单的,感谢 ozan。感谢 guava。 - Abdullah

5

尝试使用集合来存储键的值:

Map<Key, Collection<Value>>

您需要自己维护价值列表。


1
除了这里所有的答案,我有一个解决方案,如果您知道要添加到密钥的多个值的长度,则发现它最有用。在我的情况下,是2,因此我选择了它而不是使用List。
HashMap<String, String[]> multimap= new HashMap<>();
multimap.put("my_key", new String[]{"my_value1", "my_value2"});

1

Apache Commons集合类是解决方案。

    MultiMap multiMapDemo = new MultiValueMap();

    multiMapDemo .put("fruit", "Mango");
    multiMapDemo .put("fruit", "Orange");
    multiMapDemo.put("fruit", "Blueberry");

    System.out.println(multiMap.get("fruit"));
   // Mango Orange Blueberry

Maven 依赖

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -- 
     >
     <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-collections4</artifactId>
         <version>4.4</version>
    </dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接