gpt4 book ai didi

java - 为什么清除 arraylist 即使在完全分配值之后也会清除另一个 arraylist?

转载 作者:行者123 更新时间:2023-11-30 08:46:39 25 4
gpt4 key购买 nike

我创建了两个列表。第一个列表是某种类类型(Syncgroupset),第二个列表是字符串类型的数组列表。此 syncgroupset 类包含列表类型数组列表的 getter 和 setter。

我将解析 xml 并将解析的值复制到类的列表类型 (syncgroupset)。

请找到下面的xml。

<syncgroupsettings>
<syncgroupset id = "sgMS" labelid = "lblMS" enabled = "YES" default = "OFF">
<syncgroup syncgroupname = "VISITS"/>
<syncgroup syncgroupname = "CUSTOMERS"/>
</syncgroupset>

<syncgroupset id = "sgAS" labelid = "lblAS" enabled = "YES" default = "ON">
<syncgroup syncgroupname = "SALESDOCS"/>
<syncgroup syncgroupname = "ANALYTICS"/>
</syncgroupset>
</syncgroupsettings>

请找到下面的代码

public List<Syncgroupset> parse(XmlPullParser parser) {
String id = "";
String synlabelid="";
String enabled = "";
String default1 = "";
String syngroupname = "";

List<Syncgroupset> mysynset = new ArrayList<Syncgroupset>();

try {
int eventType = parser.getEventType();

List<String> mysyname = new ArrayList<String>();

while (eventType != XmlPullParser.END_DOCUMENT) {
String tagname = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if(tagname.equalsIgnoreCase("labels"))
{
skip(parser);

}else
if (tagname.equalsIgnoreCase("syncgroupsettings")) {
// do nothing
}else
if (tagname.equalsIgnoreCase("syncgroupset")) {
syncgroupset = new Syncgroupset();
id = parser.getAttributeValue(ns,"id");
synlabelid = parser.getAttributeValue(ns,"labelid");
enabled = parser.getAttributeValue(ns,"enabled");
default1 = parser.getAttributeValue(ns,"default");
syncgroupset.setLabelid(synlabelid);
syncgroupset.setEnabled(enabled);
syncgroupset.setDefault(default1);
syncgroupset.setId(id);
mysynset.add(syncgroupset);
}else
if(tagname.equalsIgnoreCase("syncgroup"))
{
syngroupname = parser.getAttributeValue(ns,"syncgroupname");
mysyname.add(syngroupname);
}
break;

case XmlPullParser.TEXT:
break;

case XmlPullParser.END_TAG:
if (tagname.equals("syncgroupset")) {
mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);
mysyname.clear();
}
break;

default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return mysynset;
}

当我遇到 syncgroup 标签时,我会将值复制到其他字符串类型的列表中。我不会仅在此处将同步组值添加到类型类列表。

当我遇到 syncgroupsetting 的结束标记时,我只是通过替换将类型字符串列表添加到类型类列表中。

然后我正在清除类型字符串的列表。当我这样做时,它甚至会清除类列表中的列表。你能告诉我哪里做错了吗?

最佳答案

Syncgroupset 似乎保留了您通过 setSyncgroup(list) 传递给它的列表的浅拷贝。这就是 list.clear() 也会影响 Syncgroupset 的原因。

改变这一行:

mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);

对此:

mysynset.get(mysynset.size() - 1).setSyncgroup(new ArrayList<String>(mysyname));

这样,它就不会被 mysyname 传递给它,但是一个全新的列表,其中复制了 mysyname 的所有元素,然后 mysyname.clear() 绝不会影响通过 setSyncgroup 调用传递的列表。

关于java - 为什么清除 arraylist 即使在完全分配值之后也会清除另一个 arraylist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32797468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com