Используйте Collections.shuffle
для создания случайной перестановки списка, затем добавьте первую половину к одному ListView
, а остальные к другому.
// do not use raw types
@FXML
private ListView<String> listview1;
@FXML
private ListView<String> listview2;
...
private final Random randomNumberGenerator = new Random();
List<String> items = new ArrayList<>(); // copy children to new list
// the following loop imho is easier to comprehend than the Stream implementation
for (Node child : vbox.getChildren()) {
CheckBox cb = (CheckBox) child;
if (cb.isSelected) {
items.add(cb.getText());
}
}
Collections.shuffle(items, randomNumberGenerator);
final int size = items.size();
final int half = size / 2;
// add first half to first ListView and second half to second ListView
listview1.getItems().setAll(items.sublist(0, half));
listview2.getItems().setAll(items.sublist(half, size));
Обратите внимание, что некоторые вызовы методов на Stream
на самом деле не нужны в вашем случае:
.filter(value -> Objects.nonNull(value))
Проверка для null
никогда не требуется для списка children
Parent
, Реализация списка запрещает вставку null
в этот список. Предыдущий фильтр выбрасывал NPE в тех случаях, когда этот предикат в любом случае дает false
. В тех случаях, когда вам нужен такой предикат, вы можете использовать ссылку на метод для сокращения кода:
.filter(Objects::nonNull)