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

标签 java dom for-loop arraylist hashmap

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

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

NodeList nlBook = doc.getElementsByTagName("Book");

for(int cnt=0; cnt < nlBook.getLength() ; cnt++){

Element elBook = (Element) nlBook.item(cnt);

Element childLine = Util.getChildElement(elBook , "ChildLine");
Element parentLine = Util.getChildElement(elBook , "ParentLine");

String parentLineNo = parentLine.getAttribute("LineNo");

if(!mapParentAndChildLines.containsKey(parentLineNo)){

            lsChildLine.add(childLine);

            mapParentAndChildLines.put((parentLineNo), lsChildLine);

        }else{

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

            mapParentAndChildLines.put((parentLineNo), lsChildLine);

        }

}

现在我必须根据每个键的列表大小执行一些逻辑。

当我循环的 xml 是这样的时,这工作得很好:

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

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

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

在这种情况下,当第一次迭代循环时,map中不存在lineNo,因此元素ChildLine被添加到列表中。

当第二次迭代循环时,该键也不存在于映射中,因此它进入 If block 。现在列表对象已经具有循环中前一个元素的 ChildLine,并且与新键对应的 childLine 被插入到同一个循环中,结果列表大小变为 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);

}

关于java - 键为字符串、值为包含元素迭代问题的 ArrayList 的 Hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25403314/

相关文章:

java - 如何迭代缓存条目

javascript - 修复 Chrome 的选项元素 onclick 事件

Javascript添加元素的好习惯

javascript - 遍历多维数组

java - 在检查之前声明循环限制有什么好处?

java - 在java中格式化UTF-8字符串最有效的方法是什么?

java - 创建 ActiveMQ 代理在后续测试中失败,找不到服务 : 'META-INF/services/org/apache/activemq/wireformat/default'

java - 仅当警报显示在浏览器 Selenium java 中时,如何单击该警报?

javascript - 无法使用 DOM 节点的属性作为 XPath/CSS 选择器查询的过滤器

java - 循环遍历数组并以特定方式列出