這個問題在這里已經有了答案: 為什么我的 ArrayList 包含添加到串列中的最后一項的 N 個副本? (5 個回答) 1 小時前關閉。
我想從 CSV 檔案中獲取資料。第一個條目是用戶名,其他條目是值。一切正常,但是當我創建新的用戶物件(名稱和賬單引數)并將其添加到用戶的 ArrayList 時,我以前存盤在陣列串列中的所有物件的賬單引數都會被覆寫。
主.java:
import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
private static Scanner scanner = new Scanner(System.in);
private static ArrayList<Integer> bills = new ArrayList<Integer>();
private static ArrayList<User> users = new ArrayList<User>();
public static void main(String[] args) throws Exception {
//ArrayList<Integer> bills = new ArrayList<Integer>();
// System.out.println("Enter full path to csv file: ");
// String path = scanner.nextLine();
// System.out.println("Enter delimiter: ");
// String delimiter = scanner.nextLine();
scanner = new Scanner(new File("..."));
//scanner.useDelimiter(";");
// while(scanner.hasNext()) {
// System.out.print(scanner.next());
// }
int i = 0;
int bill;
while(scanner.hasNextLine()) {
i ;
bills.clear();
String line = scanner.nextLine();
String[] fields = line.split(";");
String name = fields[0];
for (String field: fields) {
try {
bill = Integer.parseInt(field);
bills.add(bill);
} catch (NumberFormatException e) {
}
}
System.out.print(name);
System.out.println(bills);
User newUser = User.createUser(name, bills);
//User newUser = new User(name, bills);
System.out.println(newUser.getName() ">" newUser.getBills());
users.add(newUser);
//System.out.println();
}
scanner.close();
}
public static void getMax(String userName) {
for(int i = 0; i < users.size(); i ) {
//if(users.get(i).getName().equals(userName)) {
System.out.print(users.get(i).getName());
System.out.println(users.get(i).getBills());
//}
}
}
}
用戶.java:
import java.util.ArrayList;
import java.util.Collections;
public class User {
private String name;
private ArrayList<Integer> bills;
public User(String name, ArrayList<Integer> bills) {
this.name = name;
this.bills = bills;
}
public String getName() {
return this.name;
}
public ArrayList<Integer> getBills() {
return this.bills;
}
public static User createUser(String name, ArrayList<Integer> bills) {
return new User(name, bills);
}
}
uj5u.com熱心網友回復:
您在 each 中共享相同的bills實體User。
在回圈的每次迭代中洗掉靜態串列bills并實體化一個新串列。
while(scanner.hasNextLine()) {
List<Integer> bills = new ArrayList<>();
... reading from stream happens ...
User user = new User(name, bills);
users.add(user);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/477123.html
