4

私はコードを持っています.n個の数字を持つ配列リストを取り、それを50回シャッフルし、新しいシャッフルを別の配列リストに追加するたびに追加するという考えです。

ただし、それが行うように見えるのは、1回シャッフルして配列リストに追加することですが(そうすべきです)、次の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参考値です

50 個の個別のコレクションが必要なようです。その場合、反復ごとに新しいコレクションを作成する必要があります。

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

populationShuffle(これには、 のタイプをList<List<Integer>>またはに変更する必要があることに注意してくださいArrayList<List<Integer>>。可能であれば、インターフェースよりもプログラミングを優先してください。)

于 2012-10-02T09:19:13.443 に答える