为什么我一直只获取Java ArrayList中的最后一个对象值?
我已经设法将所有对象都放入了数组列表中,但我无法打印所有值。无论使用什么方法,只有最后一个打印。为什么我一直只获取Java ArrayList中的最后一个对象值?
它没有通过ArrayList打印,这让我想知道推送的对象是否相同。
如果是这样,我该如何改变它?我重视程序(运行FileInput.java):
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
import javax.swing.text.html.HTMLDocument.Iterator;
//lecture notes(L1) method
public class FileInput {
static String first;
static String second;
static String third;
static String fourth;
static String fifth;
static String sixth;
static int num = 1;
public static void main(String[] args)throws FileNotFoundException, IOException{
Scanner input = new Scanner(new File("player.txt"));
String data = null;
PrintWriter output = new PrintWriter("outfile.txt");
// Player1 user = new Player1();
ArrayList<Player1>listOfPlayers = new ArrayList<>();
Player1 user = new Player1();
// Tokenizing
System.out.println("CSCI213 Players Management System");
while(input.hasNextLine()){
System.out.println("\nPlayer " + num);
data = input.nextLine();
StringTokenizer token = new StringTokenizer(data,"|");
// int t = token.countTokens();
// System.out.println("t is:" + t);
first = token.nextToken().trim();
user.setLoginname(first);
second = new String(token.nextToken("|"));
user.setPassword(second);
third = new String(token.nextToken("|"));
user.setChips(third);
fourth = new String(token.nextToken("|"));
user.setUsername(fourth);
fifth = new String(token.nextToken("|"));
user.setEmail(fifth);
sixth = new String(token.nextToken("|"));
user.setBirthdate(sixth);
// user.display();
listOfPlayers.add(user);
System.out.println("Size is: " + listOfPlayers.size());
// System.out.println(user.loginname);
// System.out.println(listOfPlayers.get(num-1).loginname);
num++;
// output.write(data);
// output.write("\r\n");
}
int x = listOfPlayers.size();
System.out.println("Size is: " + x);
System.out.println(listOfPlayers);
// Display address of required
Player1 p = new Player1();
for(int i = 0; i < x; i++){
p = listOfPlayers.get(i);
System.out.println(p.loginname);
}
for(Player1 e:listOfPlayers){
System.out.println(e.loginname);
System.out.println(e.email);
}
while(input.hasNextLine()){
data = input.nextLine();
output.write(data);
output.write("\r\n");
}
input.close();
output.close();
}
}
// Store all player information
public class Player1 {
static String loginname;
static String password;
static String chips;
static String username;
static String email;
static String birthdate;
/*
public Player1(String loginname, String password,
String username, String email, String birthdate){
this.loginname = loginname;
this.password = password;
this.username = username;
this.email = email;
this.birthdate = birthdate;
}
*/
public Player1() {
// TODO Auto-generated constructor stub
}
public static String getLoginname() {
System.out.print("loginname: ");
return loginname;
}
public static void setLoginname(String loginname) {
Player1.loginname = loginname;
}
public static String getPassword() {
System.out.print("password: ");
return password;
}
public static void setPassword(String password) {
Player1.password = password;
}
public static String getUsername() {
System.out.print("username: ");
return username;
}
public static void setUsername(String username) {
Player1.username = username;
}
public static String getEmail() {
System.out.print("email: ");
return email;
}
public static void setEmail(String email) {
Player1.email = email;
}
public static String getBirthdate() {
System.out.print("birthdate: ");
return birthdate;
}
public static void setBirthdate(String birthdate) {
Player1.birthdate = birthdate;
}
public static String getChips() {
System.out.print("chips: ");
return chips;
}
public static void setChips(String chips) {
Player1.chips = chips;
}
public void display() {
System.out.println("Name: " + this.username);
System.out.println("Email: " + this.email);
System.out.println("Birthdate: " + this.birthdate);
System.out.println("Login ID: " + this.loginname);
System.out.println("Balance Chips: " + this.chips);
}
/*
@Override
public String toString() {
return "toString()=" + this.loginname + "\n";
}
*/
}
简单:
Player1 user = new Player1();
你一次又一次地加入相同对象。将该语句代入而不是您的循环。你想在每个循环迭代期间添加一个完全新的Playwer对象!
但即使如此,事情不会奏效;因为(正如Eran所说):你的Player类只有静态字段。这就像“作弊”;因为这意味着所有的球员对象会看到相同领域,太(因为静态字段共享一个类的所有实例之间!)
换句话说:静态处于良好的异常OO设计。你不使用它作为默认值;相反:您只能在特殊的角落情况下将字段设置为静态(有关示例,请参见here)。
你有两个错误:
-
你一遍又一遍地将相同
Player1
实例的列表。您应该将Player1 user = new Player1();
移动到添加球员的循环中。变化
Player1 user = new Player1(); // Tokenizing System.out.println("CSCI213 Players Management System"); while (input.hasNextLine()) {
到
// Tokenizing System.out.println("CSCI213 Players Management System"); while (input.hasNextLine()) { Player1 user = new Player1();
-
的
Player1
类的成员都是静态的,所以即使你解决了第一个问题,中Player1
所有实例将共享这些成员。您应该将它们更改为非静态。变化
public class Player1 { static String loginname; static String password; static String chips; static String username; static String email; static String birthdate;
到
public class Player1 { String loginname; String password; String chips; String username; String email; String birthdate;
忽略了......很高兴你向下滚动到结束 ;-) – GhostCat
you're八方通工作Player'的'相同的实例,就好像只会有 “一” 成为现实比如在你的'列表',但这几次。 – SomeJavaGuy
你只创建一个'Player1'的实例,在你的循环中,你只是更新对象的同一个实例,然后将它重复添加到'List'中 – MadProgrammer