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

Mah*_*ahe 29 java arraylist

我有以下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

然后,你需要ArrayListArrayLists:

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

你的问题

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

您正在使用添加ListString秒.你想要一个List包含ListStrings.

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

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)
  • 等等...

一些其他更正

遵循Java命名约定

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

了解有关类型的更多信息

你说"我想要"列表"数组[...]".无论你与谁沟通,这都令人困惑:它不是一个数组.它是一个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在循环的每次迭代中重新创建,但是您不太关心(并且清洁,可读和可维护的代码优先于预优化的代码) .

SSCCE

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

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