哈希表:只保存最后添加的元素

Hashtable: Only saving the last element added

每当我创建多个学生时,将他们添加到学生 class 哈希表,并尝试打印哈希表(或对其执行任何操作)它只包含最后输入的学生。

EX:创造学生:约翰·泰勒、蒂米·特纳、擎天柱 PrintHastable:{6=擎天柱,4=擎天柱,2=擎天柱}

如何让哈希表保存所有输入的值,而不是只保存最后一个值?

学校Class public class 学校{

//static Long counter = (long) 1;
public Hashtable<Long, Student> studentclass;


public  void addStudent() {
    
    studentclass = new Hashtable<Long, Student>(); 
    boolean addanotherstudent = true;
    long counter = TestMain.counter;
    
    Student theStudent = new Student();

    
    while(addanotherstudent) {

        String fname = "";
        while(fname.length() <=0) {
        Scanner key = new Scanner(System.in);
        System.out.print("What is your first name? ");
        fname = key.next();
        theStudent.setfname(fname);
        }

        String lname = "";
        while(lname.length() <=0) {
        Scanner key1 = new Scanner(System.in);
        System.out.print("What is your last name? ");
        lname = key1.nextLine();
        theStudent.setlname(lname);
        }

        double grade = -1;
        while(grade < 0 || grade > 4) {
        Scanner key2 = new Scanner(System.in);
        System.out.print("What is your GPA (0 - 4)? ");
        grade = key2.nextDouble();
        theStudent.setgrade(grade);
        }

        long accountId = counter++;
        String studentId = fname + lname + accountId;
        
        theStudent.setsid(studentId);
        theStudent.setaid(accountId);
        
        
        counter++;
        //Student theStudents = new Student();
        studentclass.put(counter, theStudent);
        
        
        Scanner ask =  new  Scanner(System.in);
        System.out.print("Do  you want to  add another student?(y or n) ");
        String ans = ask.nextLine();
        
        if(ans.charAt(0) == 'y' || ans.charAt(0) == 'Y') {
            
            continue;
            
            
        }else {
            
            addanotherstudent = false;
            
        }
    
}

}

TestMain Class

public class TestMain {

static long counter = 0;

//public static Hashtable<Long, Student> studentclass;

public static void main(String[] args) {
    
    //studentclass = new Hashtable<Long, Student>(); 
    
    School GSU = new School();
    
    GSU.addStudent();       
    
    GSU.filterStudent(3);

    System.out.println(GSU.studentclass);
    
    

    
}

}

学生Class

public class Student {

private  String fname;
private  String lname;
private  String sid;
private  long aid;
private double grade;

public void setfname(String setfname) {
    
    fname = setfname;
    
}

public String getfname() {
    
    return fname;
}


public void setlname(String setlname) {
    
    lname = setlname;

}

public String getlname() {
    
    return lname;
    
}

public void setsid(String setsid) {
    
    sid = setsid;

}

public String getsid() {
    
    return sid;
    
}

public void setaid(long setaid) {
    
    aid = setaid;

}

public long getaid() {
    
    return  aid;
    
}

public void setgrade(double setgrade) {
    
    grade = setgrade;

}

public double getgrade() {
    
    return  grade;
    
}

public String toString() {
    
    
    return fname + " " + lname;
    
    
    
}

您的问题与HashTable无关。

您的 Student class 有两个严重错误:

  1. 您创建了它的所有成员 static,这意味着它们只存在一次 - 当您创建此 class 的新实例时,不会创建新变量。 调用 new Stident 对您没有任何作用,您将始终覆盖任何以前的数据。

  2. 你的构造函数有反向赋值:
    而不是将构造函数参数中传递的值存储在 class 成员中,而是相反!
    您将 class 个成员的内容存储在参数中,基本上将您所有的数据都扔进了垃圾箱。

您必须解决这两个问题才能让您的程序运行!

因为学生的所有实例变量都是静态的,所以每次设置它们时,值都是 class-wide...也就是说所有实例共享您设置的相同值。每次迭代并更新 fname 的值时,所有实例都会更新,因为它们都共享相同的字段值。如果您有两个实例并更新了一个“实例”的名字,您将同时更新所有其他实例。您需要从 Student class.

中删除所有关键字 static

您的方法有几处错误。

  • 您在 Student class 构造函数中错误地初始化了变量。
  • 您已将 Student class 中的所有变量和方法设为静态。因此,对于您创建的每个新学生,您将重复使用相同的变量。

可以在此代码上进行更多改进。但我在这里添加了一个快速修复。

TestMain.java

public class TestMain {

    public static void main(String args[]) {
        addStudent();
    }


    private static Long counter = (long) 1;
    private static Hashtable<Long, Student> studentclass = new Hashtable<Long, Student>();

    public static void addStudent() {

        boolean addanotherstudent = true;
        while (addanotherstudent) {
            String fname = "";
            while (fname.length() <= 0) {
                Scanner key = new Scanner(System.in);
                System.out.print("What is your first name? ");
                fname = key.next();
            }

            String lname = "";
            while (lname.length() <= 0) {
                Scanner key1 = new Scanner(System.in);
                System.out.print("What is your last name? ");
                lname = key1.nextLine();
            }

            double grade = -1;
            while (grade < 0 || grade > 4) {
                Scanner key2 = new Scanner(System.in);
                System.out.print("What is your GPA (0 - 4)? ");
                grade = key2.nextDouble();
            }

            long accountId = counter;
            String studentId = fname + lname + accountId;

            Student student = new Student(fname, lname, studentId, accountId, grade);
            studentclass.put(counter, new Student(fname, lname, studentId, accountId, grade));

            counter++;

            Scanner ask = new Scanner(System.in);
            System.out.print("Do  you want to  add another student?(y or n) ");
            String ans = ask.nextLine();
            if (ans.charAt(0) == 'y' || ans.charAt(0) == 'Y') {

                continue;


            } else {

                addanotherstudent = false;

            }

        }
        System.out.println(studentclass);
    }
}

Student.java

public class Student {
    private String fname;
    private String lname;
    private String sid;
    private long aid;
    private double grade;

    public Student(String fname, String lname, String sid, long aid, double grade) {
        this.fname = fname;
        this.lname = lname;
        this.sid = sid;
        this.aid = aid;
        this.grade = grade;
    }

    public String getFname() {
        return fname;
    }

    public void setFname(String fname) {
        this.fname = fname;
    }

    public String getLname() {
        return lname;
    }

    public void setLname(String lname) {
        this.lname = lname;
    }

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public long getAid() {
        return aid;
    }

    public void setAid(long aid) {
        this.aid = aid;
    }

    public double getGrade() {
        return grade;
    }

    public void setGrade(double grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student{" +
                "fname='" + fname + '\'' +
                ", lname='" + lname + '\'' +
                ", sid='" + sid + '\'' +
                ", aid=" + aid +
                ", grade=" + grade +
                '}';
    }