有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我有Map<List<String>, List<String>> whatComesNext

在for循环中,对于每一次迭代,我想把List<String> text的第n个元素加到whatComesNext的值上。为什么我不能执行^{?其想法是从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()看起来很复杂,但这是因为当我试图初始化自己的字符串列表以尝试保存我的键和值时,得到了空映射,有人告诉我,这是因为我反复清除键和;将值分配给,使其为空。我想我应该通过直接引用原始的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)));。我不明白这会在哪里出错,因为我不知道哪个方法返回布尔值


共 (2) 个答案

  1. # 1 楼答案

    错误的原因是List.add(Object o)返回一个boolean,而不是列表本身。声明Map包含List<String>的实例作为值。如果您只是想向列表中添加一个值,只需从映射中检索它并对其调用add。检查null的get过程的结果,并创建一个新列表,如果是这样的话,将其放入映射中

    我还看到了其他几个问题:

    • 多次调用Arrays.asList(...),创建具有相同元素的多个列表。这是一个主要的性能问题,您很幸运,返回的列表实际上实现了equals,因此您的逻辑实际上在工作(我认为这是您在更新之前的“不工作”描述的问题)
    • 如果密钥不存在,则创建一个包含空文本的列表。如果这应该是一个空列表,那么这不是您正在做的事情,并且在以后处理不属于原始输入值的文本值(即作为第一个元素的空文本)时,您可能会遇到问题

    在我看来,如果不改变地图a键的类型,更好的实现将如下所示:

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

    密钥列表的计算只进行一次,从而提高了性能并减少了对资源的需求。我认为这样也更具可读性

  2. # 2 楼答案

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