2017-12-11 1 views
0

Java에서 HashMap 값을 설정하려고 시도하는 중 arrayList를 다시 사용하려고합니다. 나는 전에 HashMaps로 일한 적이 없었고 아직도 이것에 대해 머리 글자를 쓰고있다. 그래서 나는 제한된 지식을 가지고있다.자바 문제를 재사용하여 HashMap 채우기 목록

클래스 학생 :

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의를 reutilize하려고 할 때마다 내가 콘솔에 인쇄하려고하면 내 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

사전에 감사!

답변

4

지도에 넣은 내용은 현재 가지고있는 동일한 목록에 대한 참조입니다. 그것은 (자바가 그런 것들을하지 않기 때문에) 그것의 복사본을 만들지 않았다. 당신이 가지고있는 것은 여전히 ​​맵에있는 같은리스트이다. 당신은 새로운 것을 원하는 경우 수동으로 작성해야

grades = new ArrayList<>(); 

그리고 Student1 레코드가있는 하나의 유일한 기준보다

실제로 그지도에있을 것입니다.

자세한 내용은 Is Java "pass-by-reference" or "pass-by-value"?을 참조하십시오.

+0

감사합니다. 나는 목록을 재사용하지 않았고 이제는 완벽하게 작동합니다. –