为什么我只能在Java ArrayList中仅获得最后一个对象值



我已经设法将所有对象放入arraylist中,但我无法打印所有值。无论使用哪种方法,只有最后一个是被打印的。

它不仅是通过阵列列表打印的,这让我想知道推动的对象是否相同。

如果是,我该如何更改?我已经附加了程序(run 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("rn");
        }
        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("rn"); 
        }
        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所述(:您的玩家类仅具有静态字段。就像"作弊"一样;因为这意味着所有播放器对象也会看到相同的字段(因为 static 字段是共享在类的所有实例之间!(

换句话说:静态是良好的OO设计中的异常。您不会将其用作默认值;相反:您只在特殊的角案例中使字段静态(有关一些示例,请参见此处(。

您有两个错误:

  1. 您一遍又一遍地将相同的Player1实例添加到列表中。您应该将Player1 user = new Player1();移至添加播放器的循环中。

    更改

    Player1 user = new Player1();
    // Tokenizing
    System.out.println("CSCI213 Players Management System");
    while (input.hasNextLine()) {
    

    to

    // 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;
    

    to

    public class Player1 {
        String loginname;
        String password;
        String chips;
        String username;
        String email;
        String birthdate;
    

相关内容

最新更新