将ArrayList添加到java中的另一个ArrayList

我有以下java代码,其中我试图将ArrayList复制到另一个ArrayList。

ArrayList nodes = new ArrayList(); 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] 

我想你可能已经注意到了差异。 我无法达到预期格式的结果。 请建议我任何解决方案! 提前致谢!!

然后你需要一个ArrayListArrayLists

 ArrayList> nodes = new ArrayList>(); ArrayList nodeList = new ArrayList(); nodes.add(nodeList); 

请注意, NodeList已更改为nodeList 。 在Java命名约定中,变量以小写字母开头。 类以大写字母开头。

你的问题

主要是,你有两个主要问题:

您正在使用添加StringList 。 您想要一个包含Strings ListList

还要注意,当你调用它时:

 NodeList.addAll(nodes); 

…你要说的是将所有节点元素(这是一个字符串列表)添加到(名称很糟糕的) NodeList ,它使用的是Object,因此只添加了字符串。 这让我想到了下一点。

您似乎在nodesNodeList之间感到困惑。 您的NodeList会随着时间的推移而不断增长,这就是您添加到列表中的内容。

所以,即使做得对,如果我们要查看nodesnodeListlist的每次迭代的结束,我们会看到:

  • i = 0

     nodes: [PropertyStart,a,b,c,PropertyEnd] nodeList: [PropertyStart,a,b,c,PropertyEnd] list: [[PropertyStart,a,b,c,PropertyEnd]] 
  • 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]] 
  • 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]] 
  • 等等…

一些其他更正

遵循Java命名约定

不要使用以大写字母开头的变量名。 所以在这里,用NodeList替换NodeList )。

了解有关类型的更多信息

你说“我想要”列表“数组[…]”。 无论你与谁沟通,这都让人感到困惑:这不是一个数组。 它是由数组支持的List的实现。

类型,接口和实现之间存在差异。

使用generics可以更好地在集合中键入内容

使用generics类型,因为静态类型确实有助于解决这些错误。 此外,尽可能使用接口,除非您有充分的理由使用具体类型。

所以你的代码变成:

 List nodes = new ArrayList(); List nodeList = new ArrayList(); List> list = new ArrayList>(); 

删除不必要的代码

您可以完全取消nodeList ,并在修复类型后编写以下内容:

 list.add(nodes); 

使用正确的范围

除非您有充分理由这样做,否则最好使用最里面的范围来声明变量并限制其引用的生命周期,并促进代码中关注点的分离。

然后,您可以移动List nodes以在循环内声明(然后忘记nodes.clear()调用)。

不这样做的原因可能是性能,因为您可能希望避免在循环的每次迭代中重新创建ArrayList ,但这对您来说是不太可能的(并且干净,可读和可维护的代码优先于预先优化的代码 )。

SSCCE

最后但同样重要的是,如果您需要帮助,请使用简短,自包含,正确的示例为我们提供完全可重复的案例。

在这里你给我们你的程序的输出,但是没有提到你是如何得到它们的,所以我们假设你做了一个System.out.println(list) 。 而且你让很多人感到困惑,因为我认为你给我们的输出并不是你实际得到的。

这不是一个例子:

 ArrayList> outer = new ArrayList>(); ArrayList nodeList = new ArrayList(); // Fill in nodeList here... outer.add(nodeList); 

必要时重复。

这应该返回您指定格式的列表。

您遇到的问题是您在main for循环中的所有迭代中使用相同的ArrayList NodeList 。 每个迭代NodeList都被新元素放大。

  1. 在第一个循环之后, NodeList有5个元素(PropertyStart,a,b,c,PropertyEnd), list有1个元素(NodeList:(PropertyStart,a,b,c,PropertyEnd))

  2. 在第二个循环后, NodeList有10个元素(PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd), list有2个元素(NodeList(含10个元素),NodeList(含10个元素))

为了满足您的期望,您必须更换

 NodeList.addAll(nodes); list.add(NodeList) 

通过

 List childrenList = new ArrayList(nodes); list.add(childrenList); 

PS。 您的代码不可读,保持Java代码约定具有可读代码。 例如,很难识别NodeList是类还是对象

在for循环内启动NodeList,您将获得所需的输出。

 ArrayList nodes = new ArrayList(); ArrayList list=new ArrayList(); for(int i=0;i 

说明:NodeList是一个在整个循环中保持相同的对象,因此将相同的变量添加到循环中的列表实际上只会添加一次。 循环只在单个NodeList数组中添加变量,因此您必须看到

 [/*list*/ [ /*NodeList*/ ] ] 

和NodeList包含[prostart,a,b,c,proend,prostart,d,e,f,proend ...]

首先会声明外部Arraylist,其中包含另一个内部Arraylist

ArrayList> 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);