我有一个 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/