将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]
我想你可能已经注意到了差异。 我无法达到预期格式的结果。 请建议我任何解决方案! 提前致谢!!
然后你需要一个ArrayList
的ArrayLists
:
ArrayList> nodes = new ArrayList>(); ArrayList nodeList = new ArrayList (); nodes.add(nodeList);
请注意, NodeList
已更改为nodeList
。 在Java命名约定中,变量以小写字母开头。 类以大写字母开头。
你的问题
主要是,你有两个主要问题:
您正在使用添加String
的List
。 您想要一个包含Strings
List
的List
。
还要注意,当你调用它时:
NodeList.addAll(nodes);
…你要说的是将所有节点元素(这是一个字符串列表)添加到(名称很糟糕的) NodeList
,它使用的是Object,因此只添加了字符串。 这让我想到了下一点。
您似乎在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]]
-
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.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都被新元素放大。
-
在第一个循环之后, 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), 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);