美文网首页
集合LIST指定大小数据分区

集合LIST指定大小数据分区

作者: 明训 | 来源:发表于2021-04-25 00:56 被阅读0次

背景说明

处理集合List大量数据的时候经常需要切分处理,这里针对常用的切分方案记录如下

解决方案

guava工具包

引入maven依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.0-jre</version>
</dependency>

编写代码

 public static void main(String[] args) {
    List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
    List<List<String>> partitionList = Lists.partition(dataList, 5);
    System.out.println(partitionList.size());
}

commons-collections4工具包

引入maven依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.3</version>
</dependency>

编写代码

 public static void main(String[] args) {
    List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
    List<List<String>> partitionList = ListUtils.partition(dataList, 5);
    System.out.println(partitionList.size());
}

Java8 Stream

方案一

public static <T> List<List<T>> partition(final List<T> list, final int size){
 int limit = (list.size() + size - 1) / size;
 List<List<T>> partitionList = new ArrayList<>();
 Stream.iterate(0, n -> n + 1).limit(limit).forEach(i -> {
     partitionList.add(list.stream().skip(i * size).limit(size).collect(Collectors.toList()));
 });
return partitionList;
}

public static void main(String[] args) {
    List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
    List<List<String>> partitionList = partition(dataList, 5);
    System.out.println(JSON.toJSONString(partitionList));
}

方案二

public static void main(String[] args) {
    List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
    List<List<String>> partitionList = partition(dataList, 5);
    System.out.println(JSON.toJSONString(partitionList));

 
public static <T> List<List<T>> partition(final List<T> list, final int size) {
    int limit = (list.size() + size - 1) / size;
    List<List<T>> partitionList = Stream.iterate(0, n -> n + 1).limit(limit).parallel()
        .map(a -> list.stream().skip(a * size).limit(size).parallel().collect(Collectors.toList()))
        .collect(Collectors.toList());

    return partitionList;
}

Java7裸写

public static void main(String[] args) {
    List<String> dataList = Lists.newArrayList("1","2","3","4","5","6","7","8","9","10");
    List<List<String>> partitionList = partition(dataList, 5);
    System.out.println(JSON.toJSONString(partitionList));
}
 
 /**
  * 等分为指定个数的数组,将一组数据平均分成n组
 * @param list 要分组的数据源
 * @param size 平均分成size组
 * @return
 */
public static <T> List<List<T>> averagePartition(List<T> list,final int size) {
     List<List<T>> partitionList = new ArrayList<List<T>>();
     int remaider = list.size() % size;
     int number = list.size() / size;
     int offset = 0;
     for (int i = 0; i < size; i++) {
         List<T> value = null;
         if (remaider > 0) {
             value = list.subList(i * number + offset, (i + 1) * number + offset + 1);
             remaider--;
             offset++;
         } else {
             value = list.subList(i * number + offset, (i + 1) * number + offset);
         }
         partitionList.add(value);
     }
     return partitionList;
 }

/**
 * 等分为指定长度的数组,将一组数据固定分组,每组n个元素
* @param list 要分组的数据源
* @param size 每组size个元素
* @return
*/
public static <T> List<List<T>> partition(List<T> source,final int size) {
    List<List<T>> partitionList = new ArrayList<List<T>>();
    int remainder = source.size() % size;
    int number = (source.size() / size);
    for (int i = 0; i < number; i++) {
        List<T> subset = null;
        subset = source.subList(i * size, (i + 1) * size);
        partitionList.add(subset);
    }
    if (remainder > 0) {
        List<T> subset = null;
        subset = source.subList(number * size, number * size + remainder);
        partitionList.add(subset);
    }
    return partitionList;
}

相关文章

网友评论

      本文标题:集合LIST指定大小数据分区

      本文链接:https://www.haomeiwen.com/subject/yfmrrltx.html