我有以下java代码,我试图将ArrayList复制到另一个ArrayList.
ArrayList<String> nodes = new ArrayList<String>();
ArrayList NodeList=new ArrayList();
ArrayList list=new ArrayList();
for(int i=0;i<PropertyNode.getLength()-1;i++){
Node childNode = PropertyNode.item(i);
NodeList Children = childNode.getChildNodes();
if(Children!=null){
nodes.clear();
nodes.add("PropertyStart");
nodes.add(Children.item(3).getTextContent());
nodes.add(Children.item(7).getTextContent());
nodes.add(Children.item(9).getTextContent());
nodes.add(Children.item(11).getTextContent());
nodes.add(Children.item(13).getTextContent());
nodes.add("PropertyEnd");
}
NodeList.addAll(nodes);
list.add(NodeList);
}
Run Code Online (Sandbox Code Playgroud)
我希望"list"数组采用以下格式:
[[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,d,e,f,PropertyEnd],[PropertyStart,......]]
Run Code Online (Sandbox Code Playgroud)
但是从上面的代码中,"list"数组输出如下所示:
[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,....PropertyEnd]
Run Code Online (Sandbox Code Playgroud)
我想你可能已经注意到了这种差异.我无法达到预期格式的结果.请建议我任何解决方案!提前致谢!!
Kai*_*Kai 43
然后,你需要ArrayList的ArrayLists:
ArrayList<ArrayList<String>> nodes = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();
nodes.add(nodeList);
Run Code Online (Sandbox Code Playgroud)
请注意,NodeList已更改为nodeList.在Java命名约定中,变量以小写字母开头.类以大写字母开头.
hay*_*lem 14
主要是,你有两个主要问题:
您正在使用添加List的String秒.你想要一个List包含List的Strings.
还要注意,当你调用它时:
NodeList.addAll(nodes);
Run Code Online (Sandbox Code Playgroud)
...所有你说的是将所有节点元素(这是一个字符串列表)添加到(命名很糟糕)NodeList,它使用的是对象,因此只添加字符串.这让我想到了下一点.
你似乎在你nodes和你之间感到困惑NodeList.NodeList随着时间的推移,您的不断增长,这就是您添加到列表中的内容.
所以,即使把事情做对,如果我们看一下在你的每一次迭代结束nodes,nodeList并且list,我们会看到:
i = 0
nodes: [PropertyStart,a,b,c,PropertyEnd]
nodeList: [PropertyStart,a,b,c,PropertyEnd]
list: [[PropertyStart,a,b,c,PropertyEnd]]
Run Code Online (Sandbox Code Playgroud)i = 1
nodes: [PropertyStart,d,e,f,PropertyEnd]
nodeList: [PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd]
list: [[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd]]
Run Code Online (Sandbox Code Playgroud)i = 2
nodes: [PropertyStart,g,h,i,PropertyEnd]
nodeList: [PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,g,h,i,PropertyEnd]
list: [[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd, PropertyStart,d,e,f,PropertyEnd],[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,g,h,i,PropertyEnd]]
Run Code Online (Sandbox Code Playgroud)等等...
不要使用以大写字母开头的变量名.所以在这里,替换NodeList为nodeList).
你说"我想要"列表"数组[...]".无论你与谁沟通,这都令人困惑:它不是一个数组.它是一个List由数组支持的实现.
类型,接口和实现之间存在差异.
使用泛型类型,因为静态类型确实有助于解决这些错误.此外,尽可能使用接口,除非您有充分的理由使用具体类型.
所以你的代码变成:
List<String> nodes = new ArrayList<String>();
List<String> nodeList = new ArrayList<String>();
List<List<String>> list = new ArrayList<List<String>>();
Run Code Online (Sandbox Code Playgroud)
您可以完全取消nodeList,并在修复类型后编写以下内容:
list.add(nodes);
Run Code Online (Sandbox Code Playgroud)
除非您有充分的理由这样做,否则最好使用最内部的范围声明变量并限制其引用的生命周期,并促进代码中关注点的分离.
然后,您可以移动List<String> nodes到循环内声明(然后忘记nodes.clear()调用).
不这样做的原因可能是性能,因为您可能希望避免ArrayList在循环的每次迭代中重新创建,但是您不太关心(并且清洁,可读和可维护的代码优先于预优化的代码) .
最后但同样重要的是,如果您需要帮助,请使用简短,自包含,正确的示例为我们提供完全可重复的案例.
在这里,你给我们你的程序的输出,但没有提到你是如何得到它们的,所以我们假设你做了一个System.out.println(list).而且你让很多人感到困惑,因为我认为你给我们的输出并不是你实际得到的.
| 归档时间: |
|
| 查看次数: |
136279 次 |
| 最近记录: |