2015-11-06 76 views
1

我想要一个值的字典。钥匙都是字符串。每个键与某种类型的字符串列表相对应。如何为每个密钥创建一个字符串列表并相应更新?我会解释:如何将这些数据存储在Java中?

我有一个循环,读取一个单词列表的行。然后将单词转换为字符串代码并设置为字典中的键。这是一个字符串代码/字关系的例子。

123,[中]

456,[狗]

328,[缺陷] ...

然而,我的程序不断通过单词列表循环,最终会碰上与“the”代码相同的单词,但也许是不同的单词,可以说“猫”。所以我想在列表中的样子:

123,[中,猫]

456,[狗] ...

我如何得到它让每一个键一个ArrayList是我可以随时添加到需要的时候?我的最终目标是能够打印列表中的单词列表中的被调用代码(.get())

+0

你能提供一些你现有的代码吗? – rhgb

回答

1

听起来好像你想要Multimapthe Guava library

你也可以去使用Map<Integer, List<String>>的路线,但是你需要手动处理列表为空的情况(可能只是在这种情况下分配一个新列表)。

3

您可以制作一个HashMap。在你的情况下, HashMap<Integer, ArrayList<String>>工作正常。

+0

我知道,但如果我做列表 arrayList = new ArrayList (); 那么当我回到我的循环时,我的数据就不会消失了吗? –

+0

你能给我一个更全面的代码图片吗?我不认为这是一个问题,但是如果没有更大的代码片段很难说。 –

+0

我现在要试验这个。我仍然处于这个项目的规划阶段:/谢谢。我会很快回复你,希望哈哈! –

1

您可以使用每个ID链接到字符串列表一个HashMap:

Map<String, List<String>> dictionary = new HashMap<String,List<String>>(); 

现在让我们假设你读两个字符串:idword。要将它们添加到字典中,您可以首先验证您的ID是否已被读取(使用方法containsKey()) - 在这种情况下,您只需将该单词追加到与该ID相对应的列表中;或者,如果不是这种情况,您创建一个新的列表与这个词:

//If the list already exists... 
if(dictionary.containsKey(id)) { 
    List<String> appended = dictionary.get(id); 
    appended.add(word); //We add a new word to our current list 
    dictionary.remove(id); //We update the map by first removing the old list 
    dictionary.put(id, appended); //and then appending the new one 
} else { 
//Otherwise we create a new list for that id 
    List<String> newList = new ArrayList<String>(); 
    newList.add(word); 
    dictionary.put(id, newList); 
} 

然后,每当你想找回您的字符串列表一定的id,你可以简单地使用dictionary.get(ID);

你可以找到包含HashMap的Java documentation

+0

谢谢。我现在要解决这个问题。 –

+0

更新:我得到一个错误,它找不到词典的.add方法..? –

+0

我现在明白这一点,正是我想要的,但它仍然没有编译。字典的未知符号.add,我甚至有java.util。*导入。我正在通过终端进行编译。 –

0

我以为你不想在你的名单,所以我用,而不是设置重复的更多信息。

Map<String,Set<String>> mapToSet = new HashMap<>(); 
List<String []>keyvals = Arrays.asList(new String[][]{{"123","the"},{"123","cat"}}); 
for(String kv[] : keyvals) { 
    Set<String> s = mapToSet.get(kv[0]); 
    if(null == s) { 
     s = new HashSet<String>(); 
    } 
    s.add(kv[1]); 
    mapToSet.put(kv[0], s); 
} 
+0

这不是动态的。我需要使用数组列表,因为它是在一个大循环中进行的。 –

+0

只需用数组列表替换数组。 – WillShackleford

2

就像它已经说过,一个MultiMap似乎是你需要的。已经提出了Guava,这是一个不错的选择。你也可以使用commons-collections也有。

commons-collections提供的文档:

MultiValuedMap<K, String> map = new MultiValuedHashMap<K, String>(); 
map.put(key, "A"); 
map.put(key, "B"); 
map.put(key, "C"); 
Collection<String> coll = map.get(key); // returns ["A", "B", "C"] 

你总是可以实现自己的Multimap之,如果你不想使用外部库。使用HashMap<String,List<String>>来存储你的值,并用你自己的put,get和其他你认为合适的方法来包装它。

相关问题