리스트의 요소들 순서를 랜덤으로 정렬하는 방법에 대해서 알아보겠습니다.

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]