2017-11-23 21 views
2

私はまだ初心者ですので親切にしてください。私はFisher-Yatesアルゴリズムが配列要素を永久に変更する理由と、コレクションのシャッフル方法では理解できないことがあります。私は、Fisher-Yatesアルゴリズムがどのように機能するかを実際には正しく理解していないかもしれないと考えていますが、助けていただければ幸いです。以下のコード:Fisher-Yates(java)vs. Collections.shuffle

import java.util。*;

パブリッククラスArrayShuffle {

private static char[] letters = {'a','b','c','d','e','f','g'}; 

public static void main(String[] args) { 
    System.out.println("Collections' shuffle method:"); 
    shuffleCollections(letters); 
    System.out.print(letters); 
    System.out.println(); 
    System.out.println("Fisher-Yates method:"); 
    shuffleFisherYates(letters); 
    System.out.print(letters); 

} 

public static void shuffleCollections(char[] abc) { 
    List letterList = new ArrayList(); 
    for(int alph=0; alph<abc.length; alph++) 
     //convert char to ArrayList object 
     letterList.add(abc[alph]); 
    //shuffle 
    Collections.shuffle(letterList); 
    System.out.println(letterList); 


} 

public static void shuffleFisherYates(char[] abc) { 
    int size = abc.length; 
    Random random = new Random(); 
    for(int alph=0; alph<abc.length; alph++) { 
     int randomIndex = alph + random.nextInt(size - alph); 
     char randomLetter = abc[randomIndex]; 
     abc[randomIndex] = abc[alph]; 
     abc[alph] = randomLetter; 
    } 
    for(int shuffled = 0; shuffled<abc.length; shuffled++) 
     System.out.print(abc[shuffled]+" "); 
    System.out.println(); 

} 

}

+0

試したときの入力と出力は何ですか? – SMA

+0

さて、配列の要素をリストにコピーして、そのリストを入れ替えるだけです。なぜ配列が変更されるのですか?配列がオブジェクトの配列で、Collections.shuffle(Arrays.asList(array))を使用した場合、配列はシャッフルされます(Arrays.asListはコピーではなく元の配列のリストビューです)。 –

答えて

1

あなたshuffleFisherYates(すなわちabc[someIndex] = ...;が何をするかです)を直接入力配列を変更します。

shuffleCollectionsは、入力配列に基づいてArrayListを構築し、ArrayListを(Collections.shuffle(letterList)を呼び出して)変更します。入力配列は変更されません。

+0

ありがとうございます。しかし、Fisher-Yates法を使用して出力を元に戻す方法はありますか? – Busybitsnbytes

+0

元の配列のコピーをバックアップとして保存しない限り、@Busybitsnbytesは使用できません。 – Eran

+0

私もそう思った。どうもありがとう! – Busybitsnbytes

関連する問題