代码之家  ›  专栏  ›  技术社区  ›  Juan M

Java问题重用列表以填充HashMap

  •  0
  • Juan M  · 技术社区  · 7 年前

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

    如果我现在尝试打印到控制台,则输出为空:

    对于(地图条目<主题,列表<等级>t:student1.getGrades()。entrySet()){
    主题键=t.getKey();
    for(等级等级:t.getValue()){
    系统出来println(key.getName()+“-”+等级。getNumber());
    }
    }
    

    我真的很感激你对此提出任何意见和建议,很明显我一定是做错了什么,但我不知道是什么:D

    提前感谢!

    1 回复  |  直到 7 年前
        1
  •  4
  •   Deltharis    7 年前

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

    grades = new ArrayList<>();
    

    而唯一提到的有Student1记录的人确实会出现在那张地图上。

    看见 Is Java "pass-by-reference" or "pass-by-value"? 了解更多详细信息。

    推荐文章