Search code examples
javahashtable

Hashtable: Only saving the last element added


Whenever I create multiple students, add them to the studentclass Hashtable, and try to print the hashtable(or perform any action on it) it only holds the last Student entered.

EX: Created Students: John Taylor, Timmy Turner, Optimus Prime PrintHastable: {6=Optimus Prime ,4=Optimus Prime, 2=Optimus Prime}

How can I get the hashtable to hold all entered values as opposed to just the last one?

School Class public class School{

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

    
}

}

Student 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;
    
    
    
}

Solution

  • There are couple of things that are wrong about your approach.

    • You are initializing variables incorrectly in the Student class constructor.
    • You have made all the variables and methods in Student class static. So for every new Student you create, you will be reusing the same variables.

    Many more improvements can be made on this code. But I am adding a quick fix here.

    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 +
                    '}';
        }