30

ArrayList を別の ArrayList にコピーしようとしている次の Java コードがあります。

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

「リスト」配列を次の形式にしたい:

[[PropertyStart,a,b,c,PropertyEnd],[PropertyStart,d,e,f,PropertyEnd],[PropertyStart,......]]

しかし、上記のコードから、「リスト」配列の出力は次のようになります。

[PropertyStart,a,b,c,PropertyEnd,PropertyStart,d,e,f,PropertyEnd,PropertyStart,....PropertyEnd]

違いに気づいたのではないでしょうか。期待される形式で結果を得ることができません。

4

6 に答える 6

46

次に、のが必要ArrayListですArrayLists

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

NodeListに変更されていることに注意してくださいnodeListJava Naming Conventions では、変数は小文字で始まります。クラスは大文字で始まります。

于 2013-05-24T08:07:47.453 に答える
3

次の場合だけではありませんか?

ArrayList<ArrayList<String>> outer = new ArrayList<ArrayList<String>>();
ArrayList<String> nodeList = new ArrayList<String>();

// Fill in nodeList here...

outer.add(nodeList);

必要に応じて繰り返します。

これにより、指定した形式のリストが返されます。

于 2013-05-24T08:09:02.647 に答える
1

あなたが抱えている問題は、メインの for ループのすべての繰り返しで同じ ArrayList NodeListを使用することが原因です。各反復NodeListは、新しい要素によって拡大されます。

  1. 最初のループの後、NodeListには 5 つの要素 (PropertyStart,a,b,c,PropertyEnd) があり、リストには 1 つの要素 (NodeList: (PropertyStart,a,b,c,PropertyEnd)) があります。

  2. 2 番目のループの後、 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 がクラスかオブジェクトかを認識するのは難しい

于 2013-05-24T08:36:49.233 に答える
0

最初に、内部に別の内部Arraylistを含む外部Arraylistを宣言します

ArrayList> CompletesystemStatusArrayList; ArrayList systemStatusArrayList

CompletesystemStatusArrayList=新しい ArrayList

systemStatusArrayList=新しい 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);
于 2013-09-30T09:36:40.827 に答える
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 は、ループ全体で同じままのオブジェクトであるため、同じ変数をループ内のリストに追加すると、実際には 1 回だけ追加されます。ループはその変数を単一の NodeList 配列に追加するだけなので、見ている必要があります

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

NodeList には [prostart, a,b,c,proend,prostart,d,e,f,proend ...] が含まれます。

于 2013-05-24T08:32:18.527 に答える