【问题标题】:Hashtable: Only saving the last element added哈希表:仅保存添加的最后一个元素
【发布时间】:2020-07-03 12:41:01
【问题描述】:

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

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

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

学校班级 公开课学校{

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

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

    
}

}

学生班

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

【问题讨论】:

  • 您的问题到底是什么?你有什么问题?
  • Student 类中的 getter 和 setter 方法不应该是静态的。在 add student 方法中,您应该创建一个 Student 对象并设置字段。然后将对象放入哈希表中。

标签: java hashtable


【解决方案1】:

你的方法有几处是错误的。

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

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

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

【讨论】:

    【解决方案2】:

    你的问题与HashTable无关。

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

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

    2. 您的构造函数向后分配:
      与其在类成员中存储构造函数参数中传递的值,不如执行相反的操作!
      您将类成员的内容存储在参数中,基本上将所有数据都扔到垃圾箱中。

    您必须解决这两个问题才能让您的程序正常工作!

    【讨论】:

      【解决方案3】:

      因为学生的所有实例变量都是静态的,所以每次设置它们时,值都是类范围的……也就是说,所有实例共享您设置的相同值。每次迭代并更新fname 的值时,所有实例都会更新,因为它们都共享相同的字段值。如果您有两个实例并更新了一个“实例”的名字,那么您将同时更新所有其他实例。您需要从 Student 类中删除所有关键字 static

      【讨论】:

        猜你喜欢
        • 2022-11-27
        • 1970-01-01
        • 2019-07-04
        • 2015-12-03
        • 2020-11-17
        • 1970-01-01
        • 2020-07-02
        • 2016-10-26
        • 1970-01-01
        相关资源
        最近更新 更多