1. 개요

이 빠른 기사에서는 Java에서 컬렉션을 섞는 방법을 살펴 보겠습니다 . Java에는 List 객체 를 섞기위한 내장 메서드가 있습니다. 다른 컬렉션에도 사용할 것입니다.

2. List 섞기

우리는 방법을 사용합니다 java.util.Collections.shuffle , 입력으로 취 List 및 셔플 거기에 장소를. in-place는 셔플 된 요소로 새 List을 만드는 대신 입력에 전달 된 것과 동일한 List을 섞는 것을 의미합니다.

List 를 셔플하는 방법을 보여주는 간단한 예를 살펴 보겠습니다 .

List<String> students = Arrays.asList("Foo", "Bar", "Baz", "Qux");
Collections.shuffle(students);

의 두 번째 버전있다 java.util.Collections.shuffle 또한 입력으로의 사용자 정의 소스 받아 임의성 . 이는 애플리케이션에 대한 요구 사항이있는 경우 셔플 링을 결정적인 프로세스로 만드는 데 사용할 수 있습니다.

이 두 번째 변형을 사용하여 두 List에서 동일한 셔플 링을 수행해 보겠습니다.

List<String> students_1 = Arrays.asList("Foo", "Bar", "Baz", "Qux");
List<String> students_2 = Arrays.asList("Foo", "Bar", "Baz", "Qux");

int seedValue = 10;

Collections.shuffle(students_1, new Random(seedValue));
Collections.shuffle(students_2, new Random(seedValue));

assertThat(students_1).isEqualTo(students_2);

동일한 임의성 소스 (동일한 시드 값에서 초기화 됨)를 사용하는 경우 생성 된 난수 시퀀스는 두 셔플 모두 동일합니다. 따라서 셔플 링 후 두 List 모두 동일한 순서로 요소를 포함합니다.

3. 순서가 지정되지 않은 컬렉션의 요소 섞기

예를 들어 Set, Map 또는 Queue 와 같은 다른 컬렉션을 섞고 싶을 수 있지만 이러한 컬렉션은 모두 순서가 지정되지 않고 특정 순서를 유지하지 않습니다.

같은 일부 구현 의 LinkedHashMap , 또는 세트 A를 비교기 - 따라서 우리는 그들도 셔플 수없는, 고정 된 질서를 유지 않습니다.

그러나 우리는 요소를 먼저 List 로 변환 한 다음이 List 를 섞어 무작위로 요소에 액세스 할 수 있습니다 .

Map의 요소를 셔플 링하는 간단한 예를 살펴 보겠습니다 .

Map<Integer, String> studentsById = new HashMap<>();
studentsById.put(1, "Foo");
studentsById.put(2, "Bar");
studentsById.put(3, "Baz");
studentsById.put(4, "Qux");

List<Map.Entry<Integer, String>> shuffledStudentEntries
 = new ArrayList<>(studentsById.entrySet());
Collections.shuffle(shuffledStudentEntries);

List<String> shuffledStudents = shuffledStudentEntries.stream()
  .map(Map.Entry::getValue)
  .collect(Collectors.toList());

마찬가지로, 우리는 Set의 요소를 섞을 수 있습니다 .

Set<String> students = new HashSet<>(
  Arrays.asList("Foo", "Bar", "Baz", "Qux"));
List<String> studentList = new ArrayList<>(students);
Collections.shuffle(studentList);

4. 결론

이 빠른 사용방법(예제)에서는 java.util.Collections.shuffle 사용 하여 Java에서 다양한 컬렉션을 섞는 방법을 보았습니다 .

이것은 자연스럽게 List 와 직접 작동 하며 간접적으로 다른 컬렉션의 요소 순서를 무작위 화하는 데 활용할 수 있습니다. 또한 임의성의 사용자 지정 소스를 제공하고 결정 론적으로 만들어 셔플 링 프로세스를 제어 할 수도 있습니다.

평소처럼이 기사에서 설명하는 모든 코드는 GitHub에서 사용할 수 있습니다 .