我正在尝试在java中设置HashMap值,同时尝试重用arrayList。我之前没有和HashMaps合作过,我仍然对此深有感触,所以请耐心等待我的知识。
班级学生:
public class Student {
private static int id = 0;
private String name;
private String surname;
private Map<Subject, List<Grade>> grades;
private List<Absence> absences;
}
成绩制定者:
public void setGrades(Map<Subject, List<Nota>> grades) {
this.grades = grades;
}
班主题:
public class Subject {
private String name;
}
班级成绩:
public class Grade {
private Term term;
private String letter;
}
主程序:
Subject subject = new Subject("History");
Map<Subject, List<Grade>> gradeMap = new HashMap<Subject, List<Grade>>();
List <Grade> grades = new ArrayList<Grade>();
grades.add(new Grade(Term.FIRST_TERM, 'A'));
grades.add(new Grade(Term.SECOND_TERM, 'F'));
grades.add(new Grade(Term.THIRD_TERM, 'B'));
gradeMap.put(subject, grades);
student1.setGrades(gradeMap);
测试打印键和值:
for(Map.Entry<Subject, List<Grade>> t :student1.getGrades().entrySet()){
Subject key = t.getKey();
for (Grade grade : t.getValue()) {
System.out.println(key.getName() + " - " + grade.getNumber());
}
}
但是每当我尝试重新使用ArrayList时,由于有很多学生的成绩需要设置,我丢失了我的student1实例中的所有数据
grades.clear();
如果我现在尝试打印到控制台,则输出为空:
for(Map.Entry<Subject, List<Grade>> t :student1.getGrades().entrySet()){
Subject key = t.getKey();
for (Grade grade : t.getValue()) {
System.out.println(key.getName() + " - " + grade.getNumber());
}
}
我真的很感激对此有任何意见和建议,显然我一定做错了但我不知道:D
提前致谢!
答案 0 :(得分:4)
您在地图中添加的内容是对您仍然拥有的相同列表的引用。它没有创建它的副本(因为Java没有做这样的事情),你持有的仍然是地图中的相同列表。如果您想要一个新的,您需要手动创建它:
grades = new ArrayList<>();
并且只有对Student1记录的唯一引用确实会出现在该地图中。