2017-11-23 24 views
2

아직 초보자이므로 친절하시기 바랍니다. 피셔 - 예이츠 (Fisher-Yates) 알고리즘이 배열 요소를 영구적으로 수정하는 이유와 컬렉션의 셔플 (shuffle) 메서드가 왜 그렇지 않은지 이해하는데 어려움이 있습니다. 한 가지 이유는 피셔 - 예이츠 알고리즘이 어떻게 작동하는지 실제로 제대로 이해하지 못하는 것 같지만 어떤 도움을 주시면 감사하겠습니다. 아래 코드 :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] = ...;가하는 일입니다) 수정합니다.

귀하의 shuffleCollectionsArrayList (Collections.shuffle(letterList)에 대한 호출을 통해)가 입력 배열에 기초 ArrayList를 구축하고 수정한다. 입력 배열을 수정하지 않습니다.

+0

감사합니다. 그러나 피셔 - 예이츠 (Fisher-Yates) 방법을 사용하여 출력을 원래대로 되돌릴 수있는 방법이 있습니까? – Busybitsnbytes

+0

@Busybitsnbytes 원래 배열의 복사본을 백업으로 보관하지 않는 한. – Eran

+0

나는 너무 생각했다. 매우 감사합니다! – Busybitsnbytes