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 와 직접 작동 하며 간접적으로 다른 컬렉션의 요소 순서를 무작위 화하는 데 활용할 수 있습니다. 또한 임의성의 사용자 지정 소스를 제공하고 결정 론적으로 만들어 셔플 링 프로세스를 제어 할 수도 있습니다.