Java - contents of relevant data in HashMap

Imagine you have a student gradebook. Each student has marks in each subject in the journal. I want to save this in HashMap<>, but I cannot understand why the tags are combined.

In the journal class :

public class Journal {
    private static HashMap<String, HashMap<String, ArrayList<Integer>>> journal = new HashMap<>(); // "Student" -> "Subject", mark[]

    private HashMap<String, ArrayList<Integer>> journalContainer = new HashMap<>();
    private ArrayList<Integer> marks = new ArrayList<>();

    public void addMark(String student, String subject, int mark) {
        marks.add(mark);
        journalContainer.put(subject, mark);
        journal.put(student, journalContainer);
    }

    public static void outputMarks() {
        for(HashMap.Entry<String, HashMap<String, ArrayList<Integer>>> entry : journal.entrySet())
        {
            System.out.println(entry.getKey() + "/" + entry.getValue());
        }
    }
}

In the main class :

public class Main {
    public static void main(String[] argc) {
        getJournal().addMark("Alex", "math", 4); // name, subject, mark
        getJournal().addMark("Alex", "math", 2);
        getJournal().addMark("George", "english", 2);
        getJournal().addMark("George", "english", 2);

        Journal.outputMarks();
    }
}

So the output is:

Alex/{english=[4, 2, 2, 2], math=[4, 2, 2, 2]}
George/{english=[4, 2, 2, 2], math=[4, 2, 2, 2]}

But the correct conclusion should be:

Alex/{math=[4, 2]}
George/{english=[2, 2]}

I cannot understand what I am doing wrong. Who can help?

+4
source share
2 answers

, marks = new ArrayList<>();, Map s, journalContainer = new HashMap<>();, Map.

.

ArrayList HashMap Map s:

public void addMark(String student, String subject, int mark) {
    HashMap<String, ArrayList<Integer>> journalContainer = journal.get(student);
    if (journalContainer == null) {
        journalContainer = new HashMap<>();
        journal.put(student,journalContainer);
    }
    ArrayList<Integer> marks = journalContainer.get(subject);
    if (marks == null) {
        marks = new ArrayList<>();
        journalContainer.put(subject, marks);
    }
    marks.add(mark);
}

BTW, , (journal Map). , Map .

+4

Mark, ArrayList , , ,

:

public void addMark(String student, String subject, int mark) {
    marks.add(mark);
    journalContainer.put(subject, mark);
    journal.put(student, journalContainer);

    HashMap<String, ArrayList<Integer>> journalContainer = journal.get(student);

    if(journalContainer == null) {
        HashMap<String, ArrayList<Integer>> journalContainer = new HashMap<>();
    }

    ArrayList<Integer> marks = journalContainer.get(subject);

    if(marks == null) {
        marks = journalContainer.get(subject);
    }  

    marks.add(mark);
    journalContainer.put(subject, mark);
    journal.put(student, journalContainer);
}
0

Source: https://habr.com/ru/post/1679149/


All Articles