0

名前の配列を取り、名前がランダムに再配置されたリストのコピーを返すメソッドを作成しようとしています。以下のコードは、重複した名前を持つ新しいリストを返します。代わりに新しいリストの名前をシャッフルするにはどうすればよいですか?

public static String[] shuffle(String []names)
{
    int num =0;  
    String [] newArray = new String [names.length];
    Random r = new Random (); 
    for(int i = 0; i<names.length; i++){
        num = r.nextInt(names.length);
        if((i-1)!=num){
            newArray[i]=names[num];
        }
    }
    return newArray;
}
4

4 に答える 4

3

Collections.shuffle()リストをシャッフルするために使用できます。

自分でやりたい場合は、fisher-yates shuffle をご覧ください
(疑似コード:)

for (i = n-1; i >= 0; i--) 
    swap(names,i,r.nextInt(i+1));

swap()(配列内の2つの要素を交換する標準の交換関数はどこにありますか)

(シャッフルされた配列を持つ新しいインスタンスが必要な場合はArrays.copyOf()、アルゴリズムを実行する前に使用してコピーするだけです。

于 2012-10-12T23:13:24.167 に答える
1

他の人が示唆しているように、これを行うには他のクリーバー/簡単な方法が既にありますが、コードの問題を解決するには、newArray を名前配列のコピーにする必要があります (Arrays.copyOf を使用できます)。次のような値:

if(i!=num){
   String aux=newArray[i];
   newArray[i]=newArray[num];
   newArray[num]=aux;
}
于 2012-10-12T23:30:25.723 に答える
1

Collections.shuffle(リスト)

情報

ToListを使用してシャッフルのリストにしてから、ToArrayで配列に戻すことができます。

これは最も効率的ではないかもしれませんが、最も簡単です。

于 2012-10-12T23:12:39.317 に答える
0
public String[] shuffle(String[] ss) {
  List<String> list = Collections.shuffle(Arrays.asList(ss));
  return list.toArray(new String[ss.length]);
}
于 2012-10-12T23:14:52.553 に答える