Просто перемешайте каждый subList
, определенный началом и концом ячеек. Поскольку subList
обеспечивает представление списка, они перемешиваются на месте, поэтому нет необходимости создавать новый collection
.
List<Integer> vals = new ArrayList<>
(List.of(1,2,3,4,5,10,20,30,40,50,100,200,300,400,500,1000,2000));
shuffleBins(vals);
System.out.println(vals);
Печатает
[4, 5, 2, 3, 1, 10, 40, 20, 50, 30, 400, 200, 300, 100, 500, 2000, 1000]
метод
public static void shuffleBins(int binSize,
List<Integer> items) {
int start = 0;
for (int i = 0; i < items.size()/5; i++) {
Collections.shuffle(items.subList(start, start+binSize ));
start += binSize;
}
// finish up when items.size() % binSize != 0
Collections.shuffle(items.subList(start, items.size() ));
}
Если вы хотите сделать его более универсальным, вы можете предоставить набор индексов, указывающих начало корзины.
public static void shuffleBins(List<Integer> binStarts,
List<Integer> items) {
int start = 0;
for (int i = 0; i < binStarts.size(); i++) {
Collections
.shuffle(items.subList(start, binStarts.get(i)));
start = binStarts.get(i) + 1;
}
Collections.shuffle(items.subList(start, items.size()));
}