String []未正确添加到列表

时间:2017-02-17 19:15:52

标签: java arrays list csv

好的,所以我有两个名为idadults和adult的列表,我还有两个名为infoAdults(大小为255)和大小为1(大小为1)的String []数组。我的代码使infoAdults从CSV文件中读取信息并将该信息添加到成人列表中。它还会检查是否缺少任何值/框,并将其值更改为“9999”。在CSV文件的第15列中,每个Adult都有id,但其中一些缺失。 adultsID抓取列的每个值,然后将其添加到idadults列表中。代码还首先检查该值是否存在,如果不存在,则再次将其更改为“9999”。 我的问题是,当我打印成人列表时,它会正确打印所有内容,但是当我尝试打印idadults列表时,它只会反复打印列中的最后一次n次,n是柱。我在定义两个列表时已经尝试删除“静态”部分,但它不起作用。我也已尝试单独打印成人ID [0],并且它们都正确打印。 怎么办?

public String[] adultsID = new String[1];
public static List<String[]> idadults = new ArrayList<String[]>();
public static String csvFile = userDir + "/Adults.csv";
public String[] infoAdults = new String[255];
public static List<String[]> adults = new ArrayList<String[]>();

try {
        br = new BufferedReader(new FileReader(csvFile));

        while ((line = br.readLine()) != null) {
            infoAdults = line.split(csvSplitBy);

            for(int i=0;i<infoAdults.length;i++){
                if(infoAdults[i].isEmpty()){
                    infoAdults[i]="9999";
                }
                if(i>16){
                    adultsID[0]=infoAdults[16];
                }
                else{
                    adultsID[0]="9999";
                }
            }
            idadults.add(adultsID);
            adults.add(infoAdults);
        }
        for (String[] strings : idadults) {
            System.out.println(Arrays.toString(strings));
        }
    }

1 个答案:

答案 0 :(得分:0)

adultsID添加到adults时,您要添加adultsID的引用。

在while循环中,您只修改adultsID引用的数据:

             if(i>16){
                    adultsID[0]=infoAdults[16];
                }
                else{
                    adultsID[0]="9999";
                }

然后,您将在每次迭代时向adults添加相同的引用

idadults.add(adultsID);

因此所有引用都指向每次循环运行时修改的相同数据。

这就是为什么你只看到所有列表元素中反映的最后一个值。

但对于infoAdults,您每次都会在循环中将新数组重新分配给infoAdults

    infoAdults = line.split(csvSplitBy);

所以infoAdults引用每次迭代的新数据。

因此,您每次都会在列表中添加infoAdults的新实例,并且所有实例都引用不同的数据

要获得预期的输出,您可以在循环中每次为adultID分配一个新数组:

 while ((line = br.readLine()) != null) {
        infoAdults = line.split(csvSplitBy);
        adultsID = new String[500];
        for(int i=0;i<infoAdults.length;i++){
            if(infoAdults[i].isEmpty()){
                infoAdults[i]="9999";
            }
            if(i>16){
                adultsID[0]=infoAdults[16];
            }
            else{
                adultsID[0]="9999";
            }
        }