我有以下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);
}
我希望“list”数组采用以下格式:
[[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,d,e,f,PropertyEnd],[PropertyStart,......]]
但是从上面的代码中,“list”数组输出如下所示:
[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,....PropertyEnd]
我想你可能已经注意到了这种差异。我无法达到预期格式的结果。 请建议我任何解决方案! 在此先感谢!!
答案 0 :(得分:41)
然后您需要ArrayList
ArrayLists
:
ArrayList<ArrayList<String>> nodes = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();
nodes.add(nodeList);
请注意,NodeList
已更改为nodeList
。在Java Naming Conventions变量中以小写字母开头。类以大写字母开头。
答案 1 :(得分:14)
主要是,你有两个主要问题:
您正在使用添加List
String
个。您希望List
包含List
的{{1}}。
请注意,当你调用它时:
Strings
...所有你说的是将所有节点元素(这是一个字符串列表)添加到(命名很差的)NodeList.addAll(nodes);
,它使用的是对象,因此只添加了字符串。这让我想到了下一点。
您似乎在NodeList
和nodes
之间感到困惑。您的NodeList
会随着时间的推移不断增长,这就是您添加到列表中的内容。
所以,即使做得对,如果我们在NodeList
,nodes
和nodeList
查看每次迭代的结尾,我们会看到:
i = 0
list
i = 1
nodes: [PropertyStart,a,b,c,PropertyEnd]
nodeList: [PropertyStart,a,b,c,PropertyEnd]
list: [[PropertyStart,a,b,c,PropertyEnd]]
i = 2
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]]
等......
不要使用以大写字母开头的变量名。所以在这里,将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]]
替换为NodeList
)。
你说“我想要”列表“数组[...]”。无论你与谁沟通,这都令人困惑:它不是一个数组。它是由数组支持的nodeList
的实现。
类型,接口和实现之间存在差异。
使用泛型类型,因为静态类型确实有助于解决这些错误。另外,尽可能使用接口,除非您有充分的理由使用具体类型。
所以你的代码变成了:
List
您可以完全取消List<String> nodes = new ArrayList<String>();
List<String> nodeList = new ArrayList<String>();
List<List<String>> list = new ArrayList<List<String>>();
,并在修复类型后写下以下内容:
nodeList
除非您有充分的理由这样做,否则最好使用最里面的范围来声明变量并限制其参考的生命周期,并促进代码中关注点的分离。
然后,您可以移动list.add(nodes);
在循环中声明(然后忘记List<String> nodes
调用)。
不执行此操作的原因可能是性能,因为您可能希望避免在循环的每次迭代中重新创建nodes.clear()
,但这对您来说是非常不可能的(并且干净,可读和可维护的代码优先于预先优化的代码)。
最后但同样重要的是,如果您需要帮助,请使用short, self-Contained, correct example向我们提供完全可重现的案例。
在这里你给我们你的程序的输出,但是没有提到你是如何得到的,所以我们假设你做了ArrayList
。而且你让很多人感到困惑,因为我认为你给我们的输出并不是你实际得到的。
答案 2 :(得分:3)
这不是一个例子:
ArrayList<ArrayList<String>> outer = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();
// Fill in nodeList here...
outer.add(nodeList);
根据需要重复。
这应该以您指定的格式返回一个列表。
答案 3 :(得分:1)
你遇到的问题是你在main for循环的所有迭代中使用相同的ArrayList NodeList 。每个迭代 NodeList 都会被新元素放大。
第一次循环后, NodeList 有5个元素(PropertyStart,a,b,c,PropertyEnd), list 有1个元素(NodeList:(PropertyStart, A,b,C,PropertyEnd))
第二次循环后 NodeList 有10个元素(PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd)和列表有2个元素(NodeList(有10个元素),NodeList(有10个元素))
为了满足您的期望,您必须更换
NodeList.addAll(nodes);
list.add(NodeList)
通过
List childrenList = new ArrayList(nodes);
list.add(childrenList);
PS。您的代码不可读,请保持Java代码约定以具有可读代码。例如,很难识别NodeList是一个类还是一个对象
答案 4 :(得分:0)
在for循环中启动NodeList,您将获得所需的输出。
ArrayList<String> nodes = new ArrayList<String>();
ArrayList list=new ArrayList();
for(int i=0;i<PropertyNode.getLength()-1;i++){
ArrayList NodeList=new ArrayList();
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);
}
说明: NodeList是一个在整个循环中保持相同的对象,因此将相同的变量添加到循环中的列表实际上只会添加一次。循环只在单个NodeList数组中添加变量,因此你必须看到
[/*list*/ [ /*NodeList*/ ] ]
和NodeList包含[prostart,a,b,c,proend,prostart,d,e,f,proend ...]
答案 5 :(得分:0)
首先会声明外部Arraylist,其中包含另一个内部Arraylist
的ArrayList&GT; CompletesystemStatusArrayList; ArrayList systemStatusArrayList
CompletesystemStatusArrayList = new ArrayList
systemStatusArrayList = new ArrayList();
systemStatusArrayList.add("1");
systemStatusArrayList.add("2");
systemStatusArrayList.add("3");
systemStatusArrayList.add("4");
systemStatusArrayList.add("5");
systemStatusArrayList.add("6");
systemStatusArrayList.add("7");
systemStatusArrayList.add("8");
CompletesystemStatusArrayList.add(systemStatusArrayList);