1. Общ преглед
В тази бърза статия ще видим как можем да разбъркаме колекция в Java . Java има вграден в метод за разбъркване Списък обекти - ние ще го използваме за други колекции, както добре.
2. Разбъркване на списък
Ще използваме метода java.util.Collections.shuffle , който взема като вход списък и го разбърква на място. Под място имаме предвид, че той разбърква същия списък, както е предаден при въвеждане, вместо да създава нов с разбъркани елементи.
Нека разгледаме един бърз пример, показващ как да разбъркате списък :
List students = Arrays.asList("Foo", "Bar", "Baz", "Qux"); Collections.shuffle(students);
Има втора версия на java.util.Collections.shuffle, която също приема като вход персонализиран източник на случайност. Това може да се използва, за да превърне разбъркването в детерминиран процес, ако имаме такова изискване за нашето приложение.
Нека използваме този втори вариант, за да постигнем същото разбъркване в два списъка:
List students_1 = Arrays.asList("Foo", "Bar", "Baz", "Qux"); List 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);
Когато се използват идентични източници на произволност (инициализирани от една и съща начална стойност), генерираната последователност на случайни числа ще бъде еднаква и за двете разбърквания. Така след разбъркването и двата списъка ще съдържат елементи в точно същия ред.
3. Разбъркване на елементи от неподредени колекции
Може да искаме да разбъркаме и други колекции, като Set, Map или Queue , например, но всички тези колекции са неподредени - те не поддържат някакъв конкретен ред.
Някои реализации, като LinkedHashMap или Set with Comparator - поддържат фиксирана поръчка, поради което и ние не можем да ги разбъркаме.
Все пак можем да получим произволен достъп до техните елементи, като ги преобразуваме първо в Списък , след което разбъркваме този Списък .
Нека да видим бърз пример за разбъркване на елементи на карта :
Map studentsById = new HashMap(); studentsById.put(1, "Foo"); studentsById.put(2, "Bar"); studentsById.put(3, "Baz"); studentsById.put(4, "Qux"); List
shuffledStudentEntries = new ArrayList(studentsById.entrySet()); Collections.shuffle(shuffledStudentEntries); List shuffledStudents = shuffledStudentEntries.stream() .map(Map.Entry::getValue) .collect(Collectors.toList());
По същия начин можем да разбъркваме елементи от набор :
Set students = new HashSet( Arrays.asList("Foo", "Bar", "Baz", "Qux")); List studentList = new ArrayList(students); Collections.shuffle(studentList);
4. Заключение
В този бърз урок видяхме как да използваме java.util.Collections.shuffle за разбъркване на различни колекции в Java.
Това естествено работи директно със Списък и ние можем да го използваме индиректно, за да рандомизираме реда на елементите и в други колекции. Също така можем да контролираме процеса на разбъркване, като предоставим персонализиран източник на случайност и го направим детерминиран.
Както обикновено, целият код, демонстриран в тази статия, е достъпен в GitHub.