【问题标题】:Why do I keep getting only tha last object value in Java ArrayList?为什么我一直只获取 Java ArrayList 中的最后一个对象值?
【发布时间】:2026-02-12 13:55:01
【问题描述】:

我已设法将所有对象放入 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";
        }       
*/      
}

【问题讨论】:

  • 你总是在处理Player 的同一个实例,并且好像在你的List 中只有“一个”真实实例,但这有好几次。
  • 您只需要创建一个 Player1 实例,在您的循环中,您只需更新对象的同一个实例,然后一遍又一遍地将其添加到 List

标签: java arrays list class arraylist


【解决方案1】:

简单:

 Player1 user = new Player1();

您一次又一次地添加 same 对象。将该语句放入您的循环中。您想在每次循环迭代期间添加一个完全新的 Playwer 对象!

但即使那样,事情也不会成功;因为(正如 Eran 所想):您的 Player 类只有 static 字段。这就像“作弊”;因为这意味着所有 Player 对象也会看到 相同 字段(因为 静态 字段在类的所有实例之间共享!)

换句话说:静态是好的 OO 设计中的一个异常。您不将其用作默认值;相反:您只在特殊的极端情况下将字段设置为静态(有关一些示例,请参阅here)。

【讨论】:

    【解决方案2】:

    你有两个错误:

    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;
      

    【讨论】:

    • 忽略了...很高兴您向下滚动到最后 ;-)
    最近更新 更多