当前位置: 首页 > news >正文

Java--ListUtil工具类,实现将一个大列表,拆分成指定长度的子列表

文章目录

        • 前言
        • 实现代码
        • 执行结果

前言

在项目中有时会出现列表很大,无法一次性批量操作,我们需要将列表分成指定大小的几个子列表,一份一份进行操作,本文提供这样的工具类实现这个需求。

实现代码

以下为ListUtil工具类代码实现:

public class ListUtils {public static <T> List<List<T>> partition(final List<T> list, final int size) {if (list == null) {throw new NullPointerException("List must not be null");}if (size <= 0) {throw new IllegalArgumentException("Size must be greater than 0");}return new Partition<>(list, size);}private static class Partition<T> extends AbstractList<List<T>> {private final List<T> list;private final int size;/*** * @param list 传入的列表* @param size 指定的长度,每size个数据切割为一个子列表*/private Partition(final List<T> list, final int size) {this.list = list;this.size = size;}/*** 获取按指定长度拆分后,索引位置的子列表* @param index* @return*/@Overridepublic List<T> get(final int index) {//获取拆分后子列表的个数final int listSize = size();if (index < 0) {throw new IndexOutOfBoundsException("Index " + index + " must not be negative");}if (index >= listSize) {throw new IndexOutOfBoundsException("Index " + index + " must be less than size " +listSize);}final int start = index * size;final int end = Math.min(start + size, list.size());//返回子列表return list.subList(start, end);}@Overridepublic int size() {//(传入列表总长度/指定的长度)向上取整,即为拆分后子列表的个数return (int) Math.ceil((double) list.size() / (double) size);}@Overridepublic boolean isEmpty() {return list.isEmpty();}}
}
执行结果
  1. 在上述类里写个main方法用以测试结果。

      public static void main(String[] args) {List<String> list=new ArrayList<String>();for (int i = 0; i <= 2000; i++) {list.add(i+"");}//将list每2000条数据拆分成一个子列表List<List<String>> partition = ListUtils.partition(list, 2000);System.out.println("将list每2000条数据拆分成一个子列表:");System.out.println("子列表个数:"+partition.size());System.out.println("第二个子列表的内容:");partition.get(1).forEach(System.out::print);System.out.println("-------------------------------------------------------");System.out.println("将list每10条数据拆分成一个子列表:");List<List<String>> partition1 = ListUtils.partition(list, 10);System.out.println("子列表个数:"+partition1.size());System.out.println("第三个子列表的内容:");partition1.get(2).forEach(s -> {System.out.print(s+" ");});}
    
  2. 执行main方法,得到结果如下:
    在这里插入图片描述

  3. 分析结果

    将list每2000条数据拆分成一个子列表后,子列表个数为2,第一个子列表里的内容{0,1,…,1998,1999},第二个子列表的内容为{2000}。
    将list每10条数据拆分成一个子列表后,子列表个数为201,分别为{0,1,…,8,9},……,{1990,1991,…,1998,1999},{2000}。
    结果符合我们的要求,通过这个工具类,我们实现了所需功能。

http://www.lryc.cn/news/278694.html

相关文章:

  • SpringSecurity 密码加密登录
  • 大模型实战作业03
  • 【AI视野·今日Sound 声学论文速览 第四十四期】Tue, 9 Jan 2024
  • Windows Copilot 更新及使用教程
  • 【Android开发】不同Activity之间的数据回传实例(一)摘桃子游戏
  • 增量式PID和脉冲轴组合控制阀门开度(算法介绍)
  • 解决Vue.js Devtools未检测到Vue实例的问题
  • 【Java基础】进程与线程,并发与并行,CPU单核与多核
  • git修改最新提交(commit)信息
  • 想寻找Axure的替代品?我们已经试用了10+款设计工具,来看看吧!
  • 报文大小限制、请求体类型总结
  • rknn加载onnx时报错 GLIBC=2.29 no found librknnc.so
  • ASP .net core微服务实战(杨中科)
  • 使用命令行方式搭建uni-app + Vue3 + Typescript + Pinia + Vite + Tailwind CSS + uv-ui开发脚手架
  • VUE+bpmn.js实现工作流
  • 微信小程序Burp抓包
  • 基础篇_面向对象(什么是对象,对象演化,继承,多态,封装,接口,Service,核心类库,异常处理)
  • 【一、测试基础】Java基础语法
  • 社交距离 - 华为OD统一考试
  • Odrive 学习系列一:vscode 编译Odrive
  • Pandas实战100例 | 案例 21: 条件运算
  • Unity组件开发--长连接webSocket
  • 书客、柏曼、松下护眼台灯哪款更靠谱?实测核心数据对比PK!
  • MQTT协议
  • Unity编辑器扩展(外挂)
  • oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c
  • Java-网络爬虫(二)
  • 【android】rk3588-android-bt
  • 如何在 Microsoft Edge 浏览器中启用自动刷新
  • Redis之集群方案比较