是否有一个允许一键到多值关系的java集合?

时间:2012-04-23 14:57:24

标签: java

我需要一种允许多个值与多个键相关联的集合类型。理想情况下,我会像Map一样使用它,但map用于给定键以产生单个值。

下面是我想如何使用它的示例:

@Test
public void multipleItems() {
    Index<String, String> index = new Index<String, String>();
    index.add("key1", "value1");
    index.add("key2", "value2");
    index.add("key1", "value3");
    index.add("key2", "value4");
    index.add("key1", "value5");

    List<String> values = index.get("key2");

    assertEquals(2, values.size());
    assertEquals("value2", values.get(0));
    assertEquals("value4", values.get(1));
}

我不知道JVM中有任何实现。我可以自己实现,但我希望找到一个现有的实现。

建议?

根据以下建议,我最终使用了番石榴(并将其包装起来,因为我不想将其暴露给我的应用程序的其余部分,以防我找到更好的解决方案。

我使用these settings通过我的gradle脚本包含:'com.google.guava:guava-collections:r03'

我的“包装”类看起来像这样:

public class Indexes<K, V> {

    private HashMultimap<K, V> keyToValuesMap = HashMultimap.create();

    public void put(K key, V value) {
        this.keyToValuesMap.put(key, value);
    }

    public Set<V> get(K key) {
        return this.keyToValuesMap.get(key);
    }

}

3 个答案:

答案 0 :(得分:10)

Guava,来自Google的java库,有几种类型的Multimap,包括ListMultimapSetMultimap,有各种各样的实现。还有wiki article

答案 1 :(得分:3)

要与其他答案一起使用,如果您也无法使用第三方库,则可以通过Map<String, List<String>>Map<String, Set<String>>自行推送。

答案 2 :(得分:0)

您可以在java中使用multimap。 有关详细信息,请参阅此处。

http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/MultiMap.html