java将字符串作为hashmap值的一部分添加到StringList中
假设我有Map<List<String>, List<String>> whatComesNext
在for循环中,对于每一次迭代,我想把List<String> text
的第n个元素加到whatComesNext
的值上。为什么我不能执行^{
以下是我的完整代码:
static void learnFromText(Map<List<String>, List<String>> whatComesNext, List<String> text) {
for (int i=0; i<=text.size()-3; i++) {
if (whatComesNext.containsKey(Arrays.asList(text.get(i),text.get(i+1)))==false) {
whatComesNext.put(Arrays.asList(text.get(i),text.get(i+1)), Arrays.asList(""));
}
whatComesNext.put(Arrays.asList(text.get(i),text.get(i+1)), whatComesNext.get(Arrays.asList(text.get(i),text.get(i+1))).add(text.get(i+2)));
}
}
这个Arrays.asList()
看起来很复杂,但这是因为当我试图初始化自己的字符串列表以尝试保存我的键和值时,得到了空映射,有人告诉我,这是因为我反复清除键和;将值分配给,使其为空。我想我应该通过直接引用原始的List<String> text
来解决这个问题,因为它保持不变。其思想是首先检查一个键是否不在映射中,如果是,则为其分配一个空列表作为值,然后将text
中的一个字符串添加到映射的值中
我在运行代码时遇到的错误是Error: incompatible types: boolean cannot be converted to java.util.List<java.lang.String>
行中的whatComesNext.get(Arrays.asList(text.get(i),text.get(i+1))).add(text.get(i+2)));
。我不明白这会在哪里出错,因为我不知道哪个方法返回布尔值
# 1 楼答案
错误的原因是
List.add(Object o)
返回一个boolean
,而不是列表本身。声明Map
包含List<String>
的实例作为值。如果您只是想向列表中添加一个值,只需从映射中检索它并对其调用add
。检查null
的get过程的结果,并创建一个新列表,如果是这样的话,将其放入映射中我还看到了其他几个问题:
Arrays.asList(...)
,创建具有相同元素的多个列表。这是一个主要的性能问题,您很幸运,返回的列表实际上实现了equals
,因此您的逻辑实际上在工作(我认为这是您在更新之前的“不工作”描述的问题)在我看来,如果不改变地图a键的类型,更好的实现将如下所示:
密钥列表的计算只进行一次,从而提高了性能并减少了对资源的需求。我认为这样也更具可读性
# 2 楼答案
。add()方法返回一个布尔值,括号放错了位置,用这一行替换最后一行: