首页 > 解决方案 > 在java中将列表划分为固定数量的列表

问题描述

我试图找出一种将列表划分为固定数量列表的有效方法

示例 1

输入 - [1,2,3,4,5,6,7,8]

列表数量 - 4

输出 - [1,2]、[3,4]、[5,6]、[7,8]

示例 2

输入 - [1,2,3,4,5,6,7,8,9,10]

列表数量 - 4

输出 - [1,2,3],[4,5,6],[7,8],[9,10]

不一定要固定元素的顺序

我尝试了几个例子,但大多数都是基于将元素分成块而不是固定数字列表

我确实有这个解决方案,但如果有更好的方法,尤其是在 java 8 中,我很感兴趣

    
    
    List<Integer> intList = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

    int listIteration=0;
    int numberOfSublist = 4;
    Map<Integer,List<Integer>> intmap = new HashMap<>();
    for (int mapIteration = 1; mapIteration < numberOfSublist +1; mapIteration++) {
        intmap.put(mapIteration, new ArrayList<Integer>());
    }
    while(listIteration<intList.size()) {
        for (int mapIteration = 1; mapIteration < numberOfSublist +1; mapIteration++) {
            if(listIteration==intList.size()) {
                break;
            }
            intmap.get(mapIteration).add(intList.get(listIteration++));
        }
    }
    

标签: javajava-8

解决方案


编辑:请参考下面的这个解决方案进行 N 次分区,

爪哇 8

class SamplePartition
{
    public static void main (String[] args) throws java.lang.Exception {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        final int N=4;
        System.out.println(part(l,N));
    }
        
        private static <T> List<List<T>> Part(List<T> objs, final int N) {
        return new ArrayList<>(IntStream.range(0, objs.size()).boxed().collect(
                Collectors.groupingBy(e->e%N,Collectors.mapping(e->objs.get(e), Collectors.toList())
                        )).values());
    }
}

使用番石榴

`List<List<Integer>> partitionedLists = Lists.partition(intList, partition`);

Apache Commons 实用程序

List<List<Integer>> partitionedLists = ListUtils.partition(largeList, partition);

推荐阅读