2016-10-18 28 views
2

これでいくつかの解決策を確認しましたが、それらはすべて「静的な」単語を使用したり、 HashMap。私は人の名前(キー)とテストのスコア(値)を含むマップを作成しようとしています。私はこれを行う値のためにオブジェクトを渡すしようとしています:Mapに格納された各オブジェクトは最後のオブジェクトに格納された値を返します

HashMap<String, Scores> map = new HashMap<String, Scores>(); 

List<Integer> scores = new ArrayList<Integer>(); 
scores.add(55); 
scores.add(66); 
scores.add(77); 

map.put("foo", new Scores(scores)); 

scores.clear(); 

scores.add(70); 
scores.add(80); 
scores.add(90); 

map.put("bar", new Scores(scores)); 

System.out.println(map.get("foo").getScores()); 
System.out.println(map.get("bar").getScores()); 
System.out.println(map.get("foo").getAverage()); 

と私のスコアクラスのために私は次のようしている:

List<Integer> scores = new ArrayList<Integer>(); 
private int sum = 0; 

public Scores(List<Integer> s){ 
    this.scores = s; 
} 

public double getAverage(){ 
    int count = 0; 
    for (int x: this.scores){ 
     this.sum += x; 
     count++; 
    } 
    return this.sum/count; 
} 

public List<Integer> getScores(){ 
    return this.scores; 
} 

私は私のコードを実行すると、私は次のような出力を得ます

[70, 80, 90] 
[70, 80, 90] 
80.0 

私は自分のスコアを格納するために "静的"を使用していませんし、古い値を繰り返すことを避けるためにclear()を後で使用します。私はHashMap <>変数を作成するときにもクラス名を使用しています。

「map.get( "foo")」と「map.get( "bar")」の両方が同じ値を返す理由を教えてください。彼らはまた、実例を提供することができますか?ありがとう!

+1

マップのすべてのキーに_same_リストオブジェクトを割り当てます。これは、同じケーキボックスに別の付箋を置いたようなものです... –

答えて

3

new Scores(scores)は、それに渡されたListインスタンスのコピーを作成しません。それには、Listへの参照が格納されています。

したがって、Mapに値として入力するScoresのインスタンスは、同じListを参照してください。

新しい Listを作成する必要があります

代わりの

scores.clear(); 

scores = new ArrayList<Integer>(); 

異なるList Sを参照するには、2つのScoresインスタンスのために。

+0

ありがとう!それは今働いている! – BMonty

0

プリミティブ(byte、short、int、long、float、double、boolean、charなど)および参照型(インスタンス化可能なクラスおよび配列。 ]など)の動作が異なります。

あなたは実際に新しいのArrayListのインスタンスを作成する必要があります - このように:

scores = new ArrayList<Integer>();

新しいリストを作成します。あなたのコードでは、同じリストへの参照を渡すだけです。

関連する問題