0

我想做某种结构,我可以有重复的键,但值不同。我使用 java,hashmap 很好,但不允许重复键,我为 multimaps 导入了 google guava 库,但似乎无法让它工作任何更好的想法或建议?我想保存多个对象,然后使用键搜索它们,但有些对象将具有相同的键。

找一本java字典

这是我要插入的示例

    NP|DET|NOM|
    NP|PROPERNOUN|
    NOM|NOUN|NOUN|
    S|NP|VP|
    VP|VERB|NP|
    VP|VERB|PP|

最左边的值是键,右边的终端是值

4

5 回答 5

2

根据定义 aMap不能包含非唯一键。您需要将值存储为Collection(例如ArrayList)。

private Map<String, Collection<String>> myDictionary = new HashMap<>();

public void addWord(String word, String definition) {
    Collection definitions = myDictionary.get(word);
    if(definitions == null) {
         definitions = new ArrayList<String>();
         myDictionary.put(word, definitions);
    }
    definitions.add(definition);
}
于 2013-05-17T14:24:34.893 回答
2

我建议使用HashMap并将某种列表放入其中,例如

HashMap<String, ArrayList<TheKindOfStuffYouWantToSave>>
于 2013-05-17T14:23:04.517 回答
1

Java has no set or map structure to store duplicate keys.

If you want to store multiple values under one key, you should store Collection as value.

For example:

private Map<K, Collection<V>> map = new HashMap<K, Collection<V>> ();

public void multiPut(K k, V v) {
  Collection<V> c = map.get(k);
  if (c == null) {
    c = new ArrayList<V>();
    map.put(k, c);
   }
 c.add(v);
}
于 2013-05-17T14:25:39.847 回答
1

如果必须这样做,您将失去 O(1) 查找时间。你能做的最好的事情是,实现一个二叉树来拥有这个,如果你的键是重复的,那么它有最好的查找和插入时间。您还可以扩展 Hashmap 并覆盖 put 函数来处理冲突。

如果您可以使用 Apache Commons,请查看下面的 Multimap 和 MultiHashmap 示例。 org.apache.commons.collections.MultiHashMap

MultiMap mhm = new MultiHashMap();
mhm.put(key, "A");
mhm.put(key, "B");
mhm.put(key, "C");
Collection coll = (Collection) mhm.get(key);

来源:Apache Commons 的 Multimap & Multihashmap 文档

注意:请在发布之前检查是否已经存在问题。

于 2013-05-17T14:27:37.417 回答
0

我可以想到一个自定义逻辑,如下所述

创建一个HashMap>。这里key是单词,value是含义的arraylist。

编写一个在代码中添加字典条目的方法。方法应该检查一个键条目是否不存在,初始化一个arraylist,将值添加到这个列表中,最后将这个arraylist保存在hashmap中,以对抗新的键。如果 key 存在,则获取 arraylist 并向其中添加一个条目。

于 2013-05-17T14:22:38.357 回答