Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

DeFacto-Standard IT

[Java] 배열, 리스트 랜덤으로 섞기 Collections.shuffle() 본문

Java/References

[Java] 배열, 리스트 랜덤으로 섞기 Collections.shuffle()

defacto standard 2017. 9. 20. 09:23

프로그래밍을 하면서 Array나 Collection의 내용을 랜덤으로 바꿔야할 때가 있다.


c언어에서는 rand? 함수를 썼던 것으로 기억하고

자바에서는 Random 클래스가 제공되어(혹은 Math.random()) 이것을 사용하여 랜덤 값을 뽑아낸다.


그러나 이는 단순히 랜덤값을 뽑아내기만 하므로, 랜덤으로 배치하거나 이미 나온 값을 제외하고 다른 값을 뽑아야 하는 등의 처리는 따로 해야한다.


자바의 API를 사용하면 쉽게 배열이나 리스트의 순서를 변경할 수 있다.


Array의 경우 숫자나 문자를 랜덤으로 섞는 경우. 제비뽑기를 한다던가 할 때 사용할 것이고

Collection의 경우는 말그대로 Collection을 랜덤으로 섞어야 하는 경우일 것이다. 예를 들어서, 마피아라는 게임을 한다면 사용자들에게 나누어 줄 직업은 랜덤으로 설정해야하는 경우라던가. Stable Sorting알고리즘의 성능을 테스트하기 위해 몇 가지 샘플을 만들고 섞어 버리는 경우라던가.


단 하나의 정수 변수는 Random클래스를 사용하면 편하지만

Array나 Collection을 랜덤으로 섞을 때는 이런저런 클래스와 계산식을 사용하여 c언어처럼 랜덤을 구하지말고,

Collections.shuffle()이라는 함수를 사용하면 된다.


단, Arrays는  shuffle()을 제공하지 않으므로 이를 List라는 Collection으로 변경하여 변환하도록한다.


int nums[] = {1, 2, 3, 4, 5, 6};

Collections.shuffle( Arrays.asList( nums ) );


와 같이 사용하면, 인자로 넘어간 nums가 List로 변환되며, 요소의 내용이 랜덤으로 변경된다.

 


Array가 아닌, List Interface를 상속받는 Collection을 섞을 경우에는 해당 변수를 그대로 인자로 넘기면 가능하다.

List<Obj> list = new ArrayList<Obj>();

// list.add 반복

Collections.shuffle( list );

Comments