数组字符串工作不正确

时间:2015-06-20 17:03:22

标签: java arrays string arraylist

我需要String的动态数组。我使用ArrayList作为我的集合类型。无论我尝试什么方法,我总是遇到同样的问题:我对add()的最后一次调用导致所有以前的添加失败。我尝试了几种方法,但仍然有同样的问题。

这是我的测试代码:

package tests;

import org.apache.cocoon.xml.XMLUtils;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class TestArray
{
    public static void main(String[] args)
    {

        List<String> array1 = new ArrayList();
        String e2[] = new String[2];

        // Array 1
        array1.clear();

        array1.add("A");
        array1.add("B");
        array1.add("C");
        array1.add("D");

        int nbEnregArray1 = array1.size();
        System.out.println("Nb Enreg Array1 : " +array1.size());

        for (int i = 0; i < nbEnregArray1; i++) {
            System.out.println("Enreg " + i + " : " + array1.get(i));
        }

        // ================================
        // Array 2
        // ================================
        ArrayList<String[]> array2 = new ArrayList<>();

        array2.clear();

        e2[0] = "W";
        e2[1] = "X";
        array2.add(0, e2);
        System.out.println("Array2 : Enregistrement rang 0 " + " : " + array2.get(0)[0] + " / " + array2.get(0)[1]);

        e2[0] = "C";
        e2[1] = "V";
        array2.add(1, e2);
        System.out.println("Array2 : Enregistrement rang 0 " + " : " + array2.get(0)[0] + " / " + array2.get(0)[1]);
        System.out.println("Array2 : Enregistrement rang 1 " + " : " + array2.get(1)[0] + " / " + array2.get(1)[1]);

        e2[0] = "B";
        e2[1] = "N";
        array2.add(2, e2);
        System.out.println("Array2 : Enregistrement rang 0 " + " : " + array2.get(0)[0] + " / " + array2.get(0)[1]);
        System.out.println("Array2 : Enregistrement rang 1 " + " : " + array2.get(1)[0] + " / " + array2.get(1)[1]);
        System.out.println("Array2 : Enregistrement rang 2 " + " : " + array2.get(2)[0] + " / " + array2.get(2)[1]);

        int nbEnregArray2 = array2.size();
        System.out.println("Nb Enreg Array2 : " + nbEnregArray2);

        for (int i = 0; i < nbEnregArray2; i++) {
            System.out.println("Array2 : rang " + i + " : " + array2.get(i)[0] + " / " + array2.get(i)[1]);
        }

        // ================================
        // Array3
        // ================================

        ArrayList<ArrayList<String>> array3 = new ArrayList<>();
        ArrayList<String> a3 = new ArrayList();

        array3.clear();
        String a31, a32, a33;

        a3.clear();
        a31 = "A";
        a32 = "Z";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

        a3.clear();
        a31 = "E";
        a32 = "R";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

        a3.clear();
        a31 = "T";
        a32 = "Y";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

        for (int i = 0; i < array3.size(); i++) {
            System.out.println("Array3 : rang " + i + " : " + array3.get(i).get(0) + " / " + array3.get(i).get(1));
        }

        // ================================
        // List
        // ================================
        List<List<String>> l = new LinkedList<>();
        List<String> el = new LinkedList<>();

        l.clear();
        String l1, l2, l3;

        el.clear();
        l1 = "A";
        l2 = "Z";
        l3 = "E";
        el.add(l1);
        el.add(l2);
        el.add(l3);
        l.add(el);

        el.clear();
        l1 = "R";
        l2 = "T";
        l3 = "Y";
        el.add(l1);
        el.add(l2);
        el.add(l3);
        l.add(el);

        el.clear();
        l1 = "U";
        l2 = "I";
        l3 = "O";
        el.add(l1);
        el.add(l2);
        el.add(l3);
        l.add(el);

        for (int i = 0; i < l.size(); i++) {
            System.out.println("l : rang " + i + " : " + l.get(i).get(0) + " / " + l.get(i).get(1));
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你的问题是你要添加相同的List三次,所以你的外部List最终只有三个对同一个东西的引用。

您需要为每次插入制作一个全新的列表。

答案 1 :(得分:0)

首先,当您声明如下列表时:

List<String> array1 = new ArrayList();

为什么你使用clear(),即使你没有添加任何元素。

当您将列表添加到其他列表时,当您清除将要引用的列表时,将使用clear()时它们的值将消失。所以价值被覆盖了

前 - :

ArrayList<ArrayList<String>> array3 = new ArrayList<>();
ArrayList<String> a3 = new ArrayList();

array3.clear();  //no need of this as it has no elements
a3.clear();  //no need of this as it has no elements
            String a31, a32, a33;


        a31 = "A";
        a32 = "Z";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

        a3.clear();
        a31 = "E";
        a32 = "R";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

        a3.clear();
        a31 = "T";
        a32 = "Y";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

您正在清除旧值并将新值设置为仅使用新值引用的对象。

如果您想让所有值都在最后一个列表中,那么您需要更改clear() as:

ArrayList<ArrayList<String>> array3 = new ArrayList<ArrayList<String>>();
        ArrayList<String> a3 = new ArrayList();

        String a31, a32, a33;

        a31 = "A";
        a32 = "Z";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

        a3 = new ArrayList<String>();
        a31 = "E";
        a32 = "R";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

        a3 = new ArrayList<String>();
        a31 = "T";
        a32 = "Y";
        a3.add(a31);
        a3.add(a32);
        array3.add(a3);

你将获得所需的最终名单!! 希望它有助于解决您的问题。