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

时间:2013-05-24 08:05:47

标签: 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);
        }

我希望“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]

我想你可能已经注意到了这种差异。我无法达到预期格式的结果。 请建议我任何解决方案! 在此先感谢!!

6 个答案:

答案 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); ,它使用的是对象,因此只添加了字符串。这让我想到了下一点。

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

所以,即使做得对,如果我们在NodeListnodesnodeList查看每次迭代的结尾,我们会看到:

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

其他一些更正

遵循Java命名约定

不要使用以大写字母开头的变量名。所以在这里,将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(),但这对您来说是非常不可能的(并且干净,可读和可维护的代码优先于预先优化的代码)。

SSCCE

最后但同样重要的是,如果您需要帮助,请使用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 都会被新元素放大。

  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)和列表有2个元素(NodeList(有10个元素),NodeList(有10个元素))

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

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