0

キーの文字列と値としてのリストを含むマップがあります。いくつかのエントリをマップに入れ、マップ内のリスト値をランダムに展開した後、次の問題が発生します。

    list3 = map.get("string1");
    list3.get(0).setName("testobject");
    for(TestObject to : list3){
        System.out.println(to.getName());
    }

最初の TestObject を「testobject」という名前で設定するだけでなく、リスト (list3) 内の他の TestObjects も「testobject」という名前で設定します。

**Output**
testobject
nonameset
nonameset
nonameset
testobject
nonameset
nonameset
nonameset
testobject
nonameset

完全なコードは下に書かれています。マップ内のListの値をランダムに展開(randomlyExpand関数)して参照することに問題があるのだろうと思いますが、Javaの知識はまだまだ発展途上なので、何が起こっているのかよくわかりません。それはおそらく本当にばかげたものです。だから私の質問は:ここで何が起こっているのですか?また、同じ機能を維持しながら問題を解決するにはどうすればよいですか。

import java.util.*;
public class Test {
public static void main(String[] args) {
    Map<String, List<TestObject>> map = new HashMap<String,    List<TestObject>>();
    List<TestObject> list1 = new ArrayList<TestObject>();
    List<TestObject> list2 = new ArrayList<TestObject>();
    List<TestObject> list3 = new ArrayList<TestObject>();

    for(int i = 0; i < 5; i++){
        list1.add(new TestObject());
    }
    for(int i = 0; i < 5; i++){
        list2.add(new TestObject());
    }       
    map.put("string1", list1);
    map.put("string2", list2);

    map = randomlyExpand(map); 

    list3 = map.get("string1");
    list3.get(0).setName("testobject");
    for(TestObject to : list3){
        System.out.println(to.getName());
    }
}

//Randomly expand list values in Map from size 5 to size 10
public static Map<String, List<TestObject>> randomlyExpand(Map<String, List<TestObject>> map){
    Random ran = new Random();
    for (String key : map.keySet()){
        List<TestObject> tempList = new ArrayList<TestObject>();
        List<TestObject> values = map.get(key);
        for (int i = 0; i < 10; i++){
            int randomInt = ran.nextInt(values.size());
            tempList.add(values.get(randomInt));
        }
        map.put(key, tempList);
    }
    return map;
}
}

TestObject クラス:

public class TestObject {
private String name = "nonameset";

TestObject(){
}

public String getName(){
    return this.name;
}

public void setName(String s){
    this.name = s;
}
}
4

2 に答える 2

4

randomExpand メソッドでは、既にリストにあるものと同じ値を追加しています。リストに新しいエントリを追加しますが、オブジェクトはまったく同じです。

オブジェクトをリストに追加する場合、そのオブジェクトのコピーを追加するのではなく、オブジェクトへの参照を追加するだけです。

これが、エントリの 1 つでプロパティを変更すると、この変更が他のオブジェクトに反映されているように見える理由です。実際には、これは同じオブジェクトがリストに何度も追加されているために発生します。

于 2012-05-01T15:22:16.327 に答える
3

問題はあなたのrandomlyExpand機能にあります。これで以前に作成した 5 つの識別されたオブジェクトのリストを繰り返します。

for(int i = 0; i < 5; i++){
    list2.add(new TestObject());
}

今、あなたはこれをやっています:

 int randomInt = ran.nextInt(values.size());
 tempList.add(values.get(randomInt));

この識別されたオブジェクトの 1 つを取得し、それを別のインデックスに再度追加します。これで、この単一のオブジェクトがリスト内で 2 回 (またはそれ以上) 発生します。したがって、リストに同じオブジェクトが複数あります。それはあなたが何度も見たり反対したりする方法です。

解決策は簡単です。ループ内に新しいオブジェクトを作成します。

for (int i = 0; i < 10; i++){
    int randomInt = ran.nextInt(values.size());

    TestObject obj = new TestObject();
    obj.setName(values.get(randomInt).getName());

    tempList.add(obj);
}
于 2012-05-01T15:24:03.060 に答える