【问题标题】:Java issue reusing list to populate HashMapJava 问题重用列表来填充 HashMap
【发布时间】:2018-05-25 01:35:28
【问题描述】:

我正在尝试在 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());
            }        
        }

我非常感谢任何关于此的 cmets 和建议,显然我一定做错了什么,但我不知道是什么:D

提前致谢!

【问题讨论】:

    标签: java arraylist collections hashmap nested


    【解决方案1】:

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

    grades = new ArrayList<>();
    

    而且,对具有 Student1 记录的唯一引用确实会在该地图中。

    更多详情请见Is Java "pass-by-reference" or "pass-by-value"?

    【讨论】:

    • 谢谢!我没有重复使用这些列表并且现在可以完美运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多