哈希表:只保存最后添加的元素
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 有两个严重错误:
您创建了它的所有成员 static
,这意味着它们只存在一次 - 当您创建此 class 的新实例时,不会创建新变量。
调用 new Stident
对您没有任何作用,您将始终覆盖任何以前的数据。
你的构造函数有反向赋值:
而不是将构造函数参数中传递的值存储在 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 +
'}';
}
每当我创建多个学生时,将他们添加到学生 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 有两个严重错误:
您创建了它的所有成员
static
,这意味着它们只存在一次 - 当您创建此 class 的新实例时,不会创建新变量。 调用new Stident
对您没有任何作用,您将始终覆盖任何以前的数据。你的构造函数有反向赋值:
而不是将构造函数参数中传递的值存储在 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 +
'}';
}