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