为什么我一直只获取Java ArrayList中的最后一个对象值?

为什么我一直只获取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"; 
     }  
*/  
} 
+0

you're八方通工作Player'的'相同的实例,就好像只会有 “一” 成为现实比如在你的'列表',但这几次。 – SomeJavaGuy

+0

你只创建一个'Player1'的实例,在你的循环中,你只是更新对象的同一个实例,然后将它重复添加到'List'中 – MadProgrammer

简单:

Player1 user = new Player1(); 

你一次又一次地加入相同对象。将该语句代入而不是您的循环。你想在每个循环迭代期间添加一个完全新的Playwer对象!

但即使如此,事情不会奏效;因为(正如Eran所说):你的Player类只有静态字段。这就像“作弊”;因为这意味着所有的球员对象会看到相同领域,太(因为静态字段共享一个类的所有实例之间!)

换句话说:静态处于良好的异常OO设计。你不使用它作为默认值;相反:您只能在特殊的角落情况下将字段设置为静态(有关示例,请参见here)。

你有两个错误:

  1. 你一遍又一遍地将相同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(); 
    
  2. 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; 
    
+3

忽略了......很高兴你向下滚动到结束 ;-) – GhostCat