java—将字符串作为hashmap值的一部分添加到stringlist中

lp0sw83n  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(536)

说我有 Map<List<String>, List<String>> whatComesNext ,
在for循环中,每次迭代我都要添加 List<String> text 价值 whatComesNext . 为什么我不能表演 whatComesNext.put(key, whatComesNext.get(key).add(text.get(n))) ? 其思想是从hashmap中相应的键中检索值,并向其中添加所需的字符串。这是假设hashmap中的每个键都有一个值。
以下是我的完整代码:

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() 看起来很复杂,但这是因为我在初始化自己的字符串列表以尝试保存键和值时得到了空Map,有人告诉我这是因为我反复清除键和值分配给的列表,使它们为空。我想我应该通过直接引用原文来解决这个问题 List<String> text ,因为它保持不变。其思想是首先检查一个键是否不存在于Map中,如果存在,则为其指定一个空列表作为值,然后从中添加一个字符串 text Map的价值。
运行代码时出现的错误是 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))); . 我不明白这哪里会出错,因为我不知道哪个方法返回布尔值。

kognpnkq

kognpnkq1#

这个错误是因为 List.add(Object o) 返回一个 boolean 而不是名单本身。这个 Map 声明为包含 List<String> 作为价值。如果您只是想向列表中添加一个值,只需从Map中检索它并调用 add 在上面。检查get进程的结果 null 创建一个新的列表,如果是这样的话,把它放到Map上
我还可以看到一些其他问题:
你打电话来 Arrays.asList(...) 多次创建具有相同元素的多个列表。这是一个主要的性能问题,您很幸运,返回的列表实际上正在实现 equals ,这样您的逻辑实际上是工作的(我认为这是您的“不工作”的问题)-在您更新它之前的描述。
如果键不存在,则创建一个包含空文本的列表。如果那应该是一个空列表,那就不是你正在做的事情,而且你可能会在以后处理不属于原始输入值的文本值(即作为第一个元素的空文本)时遇到问题。
在我看来,在不改变Map键类型的情况下,更好的实现是这样的:

static void learnFromText(Map<List<String> whatComesNext, List<String>, List<String> text) {
    for (int i=0; i<= text.size() - 3; i++) {
        List<String> listKey = text.subList(i, i+2);
        List<String> value = whatComesNext.get(listKey);
        if (value == null) {
            value = new ArrayList<>();
            whatComesNext.put(listKey, value);
        }

        value.add(text.get(i+2)));
    }
}

密钥列表的计算只发生一次,从而提高了性能并减少了对资源的需求。我认为这样也更容易阅读。

ffdz8vbo

ffdz8vbo2#

.add()方法返回一个布尔值,括号放错了位置,请用这一行替换最后一行:

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));

相关问题