2017-06-13 5 views
4

学生評価のジャーナルがあるとします。それぞれの学生は、各科目のいくつかのマークをジャーナルに入れています。私はこれをHashMap<>に保存したいのですが、なぜマークを組み合わせるのか分かりません。メインクラスでjava-content HashMapの適切なデータ

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

:ジャーナルクラス

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

しかし、右の出力は次のようになります:

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

ので、出力され

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

私は何が間違っているのか分かりません。誰でも助けることができますか?

+0

GuavaまたはApache Commonsのマルチマップの使用を検討してください。 –

答えて

4

問題は、あなたがあなたがあなたの外Mapの値として使用するすべてのあなたの内なるMap秒の値、ならびに単一journalContainer = new HashMap<>();インスタンスとして使用することを単一marks = new ArrayList<>();インスタンスを持っているということです。

私はこれらの2つのインスタンス変数を削除し、代わりにローカル変数を使用します。

あなたMap秒の値として明確なArrayList sおよびインナーHashMap 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); 
} 

ところで、それは静的メンバ(journalMapを変更するインスタンスメソッドを持ってしても意味がありません。 )。メソッドを静的にするか、またはMapを非静的にします。

+0

申し訳ありませんが、これは 'outputMarks()'に関する私のせいです。私はこれを編集する。あなたの助けを借りてグレース、あなたは素晴らしいです – phen0men

+0

私は1つの質問があります。ジャーナルからマークを削除するにはどうしたらいいですか?選択した値(例えば、5)でマークを削除することのみが実現したが、間違って選択された値のマークをすべて削除する。これは別の質問です。あなたがそれに答えることができるなら、私は新しい質問をすることができます – phen0men

+1

@ phen0men特定の学生と科目のArrayListからマークを削除することを意味しますか?インデックスで削除することができます。 – Eran

0

新しいマークを追加している場合は、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); 
}