Java 在列表中n个大小的垃圾箱内洗牌列表

Java 在列表中n个大小的垃圾箱内洗牌列表,java,sorting,Java,Sorting,我有一个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] 如何有效地执行此操作将数组放入列表并洗牌子列表: 整数[]

我有一个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]

如何有效地执行此操作

将数组放入列表并洗牌子列表:

整数[]数组=新整数[]{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 }; List List=Arrays.ASLISTARRY; int-binSize=5; 对于int i=0,n=list.size;i 方法

    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()));
}

很好的解决方案。顺便说一句,不需要转换回数组。对于Object[]数组,arrays.asList方法只提供所提供数组的列表视图。所以一旦被洗牌,数组也会被洗牌。这也意味着您可以完成Collections.ShuffleArray.asListarray.subList。。。。这也会起作用。好的观点-我用了明显的而不是聪明的例子,但这是一个很好的优化。
[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()));
}