在循环中清空arraylist

时间:2017-05-31 10:43:56

标签: java arrays

如果每次有attributeList添加"我怎样才能清空{#1}} largeAttributeList的值?我已经尝试过.clear()但是然后largeAttributeList丢失了所有值。

ArrayList<String> attributeList = new ArrayList<String>();
ArrayList<ArrayList<String>> largeAttributeList = new 
ArrayList<ArrayList<String>>();

for (int i = 0; i < attribute.getLength(); i++) {
        String current = attribute.item(i).getTextContent();
        if(current.equals("Identifier")){
            largeAttributeList.add(attributeList);
        }
        else{
            attributeList.add(current);
        }
    }

4 个答案:

答案 0 :(得分:7)

您可以在循环中隐藏数组:

....
ArrayList<String> attributeList;
for (int i = 0; i < attribute.getLength(); i++) {
    String current = attribute.item(i).getTextContent();
    if (current.equals("Identifier")) {
        largeAttributeList.add(attributeList);
        attributeList = new ArrayList<>();//<<<-------------
    } else {
        attributeList.add(current);
    }

}

答案 1 :(得分:2)

您需要在清算前复制清单:

    largeAttributeList.add(new ArrayList<>(attributeList));

更新:YCF_L解决方案明显优于我的解决方案,因为没有必要获得开销并为GC提供额外的工作。

答案 2 :(得分:2)

当你这样做时:

largeAttributeList.add(attributeList);

您没有复制attributeList,而是添加对largeAttributeList的引用。我认为最好的解决方案是在循环中重新初始化attributeList:

List<List<String>> identifierAttributes = new ArrayList<List<String>>();
List<String> attributes = new ArrayList<String>();
for (int i = 0; i < attribute.getLength(); i++) {        
    String current = attribute.item(i).getTextContent();
    if(current.equals("Identifier")){
        identifierAttributes.add(attributes);
        attributes = new ArrayList<String>();
    }
    else {
        attributes.add(current);
    }
}

答案 3 :(得分:1)

ArrayList中添加attributeList时为attributeList创建新的largeAttributeList对象:

largeAttributeList.add(new ArrayList<String>(attributeList));

以这种方式执行attributeList.clear()时,您只清除attributeList,而不是largeAttributeList中添加的列表对象。