好的,所以我有两个名为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));
}
}
答案 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";
}
}