gpt4 book ai didi

Java 重用列表来填充 HashMap 的问题

转载 作者:行者123 更新时间:2023-12-01 17:53:08 25 4
gpt4 key购买 nike

我正在尝试在 java 中设置 HashMap 值,同时尝试重用 arrayList。我以前没有使用过 HashMap,但我仍然对此很了解,所以请容忍我有限的知识。

类(class)学生:

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

类(class)主题:

public class Subject {

private String name;
}

类(class)成绩:

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

提前致谢!

最佳答案

您在 map 中输入的内容是对您仍然拥有的同一列表的引用。它没有创建它的副本(因为 Java 不做这样的事情),您保存的仍然是 map 中的相同列表。如果您想要一个新的,您需要手动创建它:

grades = new ArrayList<>();

并且对具有 Student1 记录的唯一引用确实会在该 map 中。

参见Is Java "pass-by-reference" or "pass-by-value"?了解更多详情。

关于Java 重用列表来填充 HashMap 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47754455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com