Перемешать список в пределах n ячеек в списке - PullRequest
2 голосов
/ 03 августа 2020

У меня есть список java, например:

a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]

Я хочу перетасовать его, но в пределах n ячеек размера. Из bin, я имел в виду, я хочу перемешать первые 5 элементов, затем следующие 5 и так далее .. Итак, один из ожидаемых результатов будет:

sorted = [3,5,4,2,1, 8,9,7,10,6, 14,11,12,15,13, 19,20,17,18,16, 22,21]

Как я могу сделать это эффективно

Ответы [ 2 ]

4 голосов
/ 03 августа 2020

Поместите массив в список и перемешайте подсписки:

        Integer[] array = new Integer [] {                                                    
            1, 2, 3, 4, 5, 6, 7, 8, 9, 10,                                      
            11, 12, 13, 14, 15, 16, 17, 18, 19, 20,                             
            21, 22                                                              
        };                                                                      
        List<Integer> list = Arrays.asList(array);                              
        int binSize = 5;                                                        
                                                                                
        for (int i = 0, n = list.size(); i < n; i += binSize) {                 
            int j = Math.min(i + binSize, n);                                   
                                                                                
            Collections.shuffle(list.subList(i, j));                            
        }                                                                       
                                                                                
        array = list.toArray(new Integer[] { });                                
                                                                                
        System.out.println(Arrays.toString(array));
[2, 1, 3, 4, 5, 6, 8, 10, 7, 9, 13, 11, 15, 14, 12, 19, 16, 17, 20, 18, 22, 21]
0 голосов
/ 03 августа 2020

Просто перемешайте каждый 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()));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...