[Java] 리스트 랜덤 정렬, 3가지 방법
June 03, 2024
리스트의 요소들 순서를 랜덤으로 정렬하는 방법에 대해서 알아보겠습니다.
1. shuffle()을 이용한 방법
Collections.shuffle(list)
는 list의 요소들을 무작위로 섞습니다.
아래와 같이 리스트를 랜덤하게 정렬시킬 수 있습니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Example {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println("list: " + list);
// 랜덤하게 정렬 (순서 섞기)
Collections.shuffle(list);
System.out.println("Result: " + list);
}
}
Output:
list: [1, 2, 3, 4, 5]
Result: [3, 4, 1, 5, 2]
2. for문으로 직접 구현하는 방법
아래 예제는 for문을 이용하여 shuffle을 구현하였습니다. Random을 이용하여 루프를 돌면서 무작위 수를 뽑고, 리스트의 값들을 변경하였습니다.
random.nextInt(i + 1)
: 0 ~ i 범위의 랜덤 숫자(index) 뽑음- 리스트의 끝에서 앞으로 순회하면서 랜덤하게 swap
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class Example {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println("list: " + list);
// 랜덤하게 정렬 (순서 섞기)
Random random = new Random();
for (int i = list.size() - 1; i > 0; i--) {
// i는 리스트 끝부터 앞으로 이동
int j = random.nextInt(i + 1);
int temp = list.get(i);
// i와 j 인덱스의 값을 서로 변경
list.set(i, list.get(j));
list.set(j, temp);
}
System.out.println("Result: " + list);
}
}
Output:
list: [1, 2, 3, 4, 5]
Result: [4, 1, 2, 5, 3]
3. Stream을 이용한 방법
아래와 같이 Stream.sort()
를 이용하여 랜덤하게 요소들을 정렬할 수 있습니다.
new Random().nextInt(3)
: 0에서 3미만의 숫자 중에 랜덤하게 뽑음, 즉,0, 1, 2
중에 하나가 랜덤으로 뽑힘new Random().nextInt(3) - 1
: -1, 0, 1 중에 랜덤하게 하나 뽑음,sorted()
에서 리턴 값 -1은 a가 작음, 0은 같음, 1은 큼을 의미.sorted((a, b) -> new Random().nextInt(3) - 1)
: 리스트의 요소들을 랜덤하게 정렬
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println("list: " + list);
// 랜덤하게 정렬 (순서 섞기)
List<Integer> result = list.stream()
.sorted((a, b) -> new Random().nextInt(3) - 1)
.collect(Collectors.toList());
System.out.println("Result: " + result);
}
}
Output:
list: [1, 2, 3, 4, 5]
Result: [3, 4, 1, 2, 5]