Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符串作为hashmap值的一部分添加到StringList中_Java_String_List_Dictionary_Hashmap - Fatal编程技术网

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

Java 将字符串作为hashmap值的一部分添加到StringList中,java,string,list,dictionary,hashmap,Java,String,List,Dictionary,Hashmap,假设我有Map whatComesNext 在for循环中,对于每次迭代,我都要将列表文本的第n个元素添加到whatComesNext的值中。为什么我不能执行whatComesNext.put(key,whatComesNext.get(key).add(text.get(n))?其想法是从hashmap中相应的键中检索值,并向其中添加我所需的字符串。这是假设hashmap中的每个键都有一个值 以下是我的完整代码: static void learnFromText(Map<List<

假设我有
Map whatComesNext

在for循环中,对于每次迭代,我都要将
列表文本的第n个元素添加到
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)));
    }
}
static void learnFromText(映射whatComesNext,列表文本){

对于(int i=0;i而言,错误源于
List.add(Object o)
返回一个
布尔值
,而不是列表本身。
映射
被声明为包含
列表
的实例作为值。如果您只是想向列表中添加值,只需从映射中检索该值并在其上调用
添加
。检查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)));
    }
}

static void learnFromText(Map错误来自
List.add(Object o)
返回一个
布尔值
,而不是列表本身。
映射
被声明为包含
列表
的实例作为值。如果您只是想向列表中添加值,只需从映射中检索该值并在其上调用
添加
。检查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)));
    }
}
static void learnFromText(MapThe.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));
.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));

您试过调试它吗?另外,不建议在
映射中使用可变
集合作为键。您是否遇到异常?编译错误?我不确定问题是什么。抱歉,添加了我的编译错误。@JacobG在HashMap中使用列表是不可协商的,因为它是在给我的代码中提供的.add()返回一个布尔值。您只需执行map.get(key).add(“”)即可。无需放置()同样,它已经在映射中。你试过调试它吗?另外,不建议在映射中使用可变的
集合作为键。你是否遇到异常?编译错误?我不确定问题是什么。抱歉,添加了我的编译错误。@JacobG使用HashMap中的列表是不可协商的,因为它是可以提供的在给我的代码中,d返回一个布尔值。您只需执行map.get(key.add(“”)即可。无需放置(“”)同样,它已经在地图上了。好答案+1。我唯一不同意的是,你说Arrays.asList返回一个覆盖等于的列表是幸运的。List的文档指定了所有实现必须使用等于的确切方式。@cpp初学者坦率地说,我不认为在这里阅读Javdoc是为了确保它是正确的为了让这整件事顺利进行,我们必须按照它所需要的方式去做,所以“幸运”在我看来,这仍然是一个很好的描述。我怀疑你关于java文档没有被阅读的说法是对的。我刚刚看到你的答案有一个真正的问题。使用子列表返回的列表作为映射键是一个非常糟糕的主意。如果支持列表在结构上被修改,那么即使是看起来很无辜的方法,比如get(int)的行为也会被改变变得未定义。我认为对于ArrayList,您会引发异常。@cpp初学者
get
应该没有问题,但不能修改原始列表。我计划向源代码添加注释,但忘记了它。为了安全起见,您应该坚持使用
Arrays.asList(…)
即使这样也不安全。如果列表更改,哈希代码也会更改,您将无法再检索值。我认为只有不可变列表才可以用作映射键。谢天谢地,java 9现在有了不可变列表。好答案+1。我唯一不同意的一点是,您说Arrays.asList返回一个覆盖等于的列表是幸运的。列表的文档明确说明了equals在