Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.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 键为字符串、值为ArrayList的Hashmap包含元素迭代问题_Java_Dom_For Loop_Arraylist_Hashmap - Fatal编程技术网

Java 键为字符串、值为ArrayList的Hashmap包含元素迭代问题

Java 键为字符串、值为ArrayList的Hashmap包含元素迭代问题,java,dom,for-loop,arraylist,hashmap,Java,Dom,For Loop,Arraylist,Hashmap,我有一个HashMap,它以字符串作为键,以元素的ArrayList作为值 我为此编写的逻辑是: List lsChildLine=new ArrayList() NodeList nlBook=doc.getElementsByTagName(“Book”); 对于(int cnt=0;cnt

我有一个HashMap,它以字符串作为键,以元素的ArrayList作为值

我为此编写的逻辑是: List lsChildLine=new ArrayList()

NodeList nlBook=doc.getElementsByTagName(“Book”);
对于(int cnt=0;cnt
现在,我必须根据每个键的列表大小进行一些逻辑

当我是循环使用的xml时,这很好,如下所示:

    <BookShelf>
    <Book Name="ABC">
        <ParentLine LineNo="1">
        <ChildLine LineNo="2">
    </Book>
   </BookShelf>
    <BookShelf>
    <Book Name="ABC">
        <ParentLine LineNo="1">
        <ChildLine LineNo="2">
    </Book>
    <Book Name="ABC">
        <ParentLine LineNo="3">
        <ChildLine LineNo="4">
    </Book>
   </BookShelf>

但当xml如下所示时,这不起作用:

    <BookShelf>
    <Book Name="ABC">
        <ParentLine LineNo="1">
        <ChildLine LineNo="2">
    </Book>
   </BookShelf>
    <BookShelf>
    <Book Name="ABC">
        <ParentLine LineNo="1">
        <ChildLine LineNo="2">
    </Book>
    <Book Name="ABC">
        <ParentLine LineNo="3">
        <ChildLine LineNo="4">
    </Book>
   </BookShelf>

在这个场景中,当循环第一次被迭代时,lineNo不在映射中,因此元素ChildLine被添加到列表中

当循环第二次迭代时,该键也不在映射中,因此它进入If块。现在列表对象已经具有循环中前一个元素的子行,并且与新键对应的子行被插入到同一个循环中,因此列表大小变为2,而理想情况下它应该是1

我想不出一个合适的逻辑来避免这一点,尽管我觉得这与将列表贴在正确的位置有关


有什么帮助吗

在代码中只创建一个列表,因此所有元素都将添加到此同一列表中。相反,为每个新的
parentLineNo
创建一个新列表

if(!mapParentAndChildLines.containsKey(parentLineNo)){

    // Create a new list to add in the map
    lsChildLine = new ArrayList();
    lsChildLine.add(childLine);

    mapParentAndChildLines.put((parentLineNo), lsChildLine);

}else{

    lsChildLine =  mapParentAndChildLines.get(parentLineNo);
    lsChildLine.add(childLine);

    // Unnecessary, the list is already in the map
    // mapParentAndChildLines.put((parentLineNo), lsChildLine);

}

谢谢你,威尔克……你说得对。。。我以前曾想过这样做,但后来错过了一些计算,我认为这是行不通的。所以就不提了。但非常感谢您提供了简单的解决方案。