아직 초보자이므로 친절하시기 바랍니다. 피셔 - 예이츠 (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();
}
}
시도했을 때 입력 및 출력은 무엇입니까? – SMA
글쎄, 당신은 단순히 배열의 요소를리스트에 복사하고 그리스트를 뒤섞기 만하면된다. 배열이 왜 수정 될까요? 배열이 객체의 배열이고 Collections.shuffle (Arrays.asList (array))을 사용한 경우 Arrays.asList는 복사본이 아닌 원래 배열의 목록 뷰이기 때문에 배열이 임의로 분리됩니다. –