4

我有一段代码,想法是它接收一个包含 n 个数字的数组列表,并将其随机播放 50 次,每次都将新的随机播放添加到另一个数组列表中。

然而,它似乎做的是洗牌一次,将它添加到数组列表中(就像应该),但接下来的 49 次,它不会洗牌。它只添加相同的。您可能会从我下面的代码中了解更多:

int chromeSize;
ArrayList<GeoPoint> geoPoints = new ArrayList<GeoPoint>();      
ArrayList<Integer> addToFirstChrome = new ArrayList<Integer>();
ArrayList<ArrayList<Integer>> populationShuffle = new ArrayList<ArrayList<Integer>>();

for (int i=0; i<geoPoints.size(); i++) {
  addToFirstChrome.add(i);
}
System.out.println("add To First Chrome " + addToFirstChrome);

for (int j =0; j<50; j++) {
  Collections.shuffle(addToFirstChrome);
  populationShuffle.add(addToFirstChrome);
}  

for (int p=0;p<populationShuffle.size();p++) {
  System.out.println("Pop " + p +"=" + populationShuffle.get(p));
}

这是输出示例:

10-02 10:10:26.785: I/System.out(19648): add To First Chrome [0, 1, 2, 3, 4]
10-02 10:10:26.790: I/System.out(19648): Pop 0=[2, 1, 3, 4, 0]
10-02 10:10:26.790: I/System.out(19648): Pop 1=[2, 1, 3, 4, 0]
10-02 10:10:26.790: I/System.out(19648): Pop 2=[2, 1, 3, 4, 0]
10-02 10:10:26.790: I/System.out(19648): Pop 3=[2, 1, 3, 4, 0]
10-02 10:10:26.790: I/System.out(19648): Pop 4=[2, 1, 3, 4, 0]

如您所见,它会洗牌第一个,但不再洗牌了。我在这里错过了什么吗?

4

1 回答 1

8

我在这里错过了什么吗?

是的。您错过了在每次迭代中添加相同引用的事实:

for(int j =0; j<50; j++) {
    Collections.shuffle(addToFirstChrome);
    populationShuffle.add(addToFirstChrome);
}

实际上与以下内容相同:

for (int j =0; j < 50; j++) {
    Collections.shuffle(addToFirstChrome);
}
for (int j = 0; j < 50; j++) {
    populationShuffle.add(addToFirstChrome);
}

的值addToFirstChrome只是一个参考。

It sounds like you want 50 separate collections, in which case you need to create a new collection on each iteration:

for (int j = 0; j < 50; j++) {
    List<Integer> copy = new ArrayList<Integer>(addToFirstChrome);
    Collections.shuffle(copy);
    populationShuffle.add(copy);
}

(Note that this requires you to change the type of populationShuffle to List<List<Integer>> or ArrayList<List<Integer>> - prefer programming to interfaces where possible.)

于 2012-10-02T09:19:13.443 回答