最全Java集合分片处理!!! Java 中 List 分片的 7种方法

文章目录

  • Java 中 List 分片的 7种方法
    • 业务需求背景
    • 实现方法
      • 方法一:最基本的 for 循环实现
      • 方法二:利用 List 的 subList() 方法
      • 方法三:stream 流操作 filter 方法过滤
      • 方法四:使用 Google Guava 的 Lists.partition 方法
      • 方法五:使用 apache commons 的 ListUtils.partition 方法
      • 方法六:使用 Hutool 的 ListUtil.partition 方法
      • 方法七:使用 Java8 的 Collectors.partitioningBy() 方法

Java 中 List 分片的 7种方法

业务需求背景

最近的一个需求中需要将一个完整的 List 分割成两部分,比如:

  • 集合 [1,2,3,4,5] 需要分割成 [1,2,3] 和 [4,5];
  • 集合 [1,2,3,4,5,6] 需要分割成 [1,2,3] 和 [4,5,6];

实现方法

方法一:最基本的 for 循环实现

实现代码:

public static void divideList(List<String> list) {List<String> firstList = new ArrayList<>();List<String> secondList = new ArrayList<>();int length = list.size();// 判断集合元素个数是奇数个if (length % 2 == 1) {for (int i = 0; i < length; i++) {if (i < (length / 2 + 1)) {firstList.add(list.get(i));} else {secondList.add(list.get(i));}}} else {for (int i = 0; i < length; i++) {if (i < (length / 2)) {firstList.add(list.get(i));} else {secondList.add(list.get(i));}}}System.out.println("firstList"+firstList);System.out.println("secondList"+secondList);}

测试:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList(list1);}

测试结果:
在这里插入图片描述

方法二:利用 List 的 subList() 方法

public static void divideList2(List<String> list) {int length = list.size();int mid = length / 2; // 计算中间位置List<String> firstList = new ArrayList<>();List<String> secondList = new ArrayList<>();// 判断集合元素个数是奇数个if (length % 2 == 1) {firstList = new ArrayList<>(list.subList(0, mid + 1)); // 获取前半部分 listsecondList = new ArrayList<>(list.subList(mid + 1, list.size())); // 获取后半部分 list} else {firstList = new ArrayList<>(list.subList(0, mid)); // 获取前半部分 listsecondList = new ArrayList<>(list.subList(mid, list.size())); // 获取后半部分 list}System.out.println("firstList" + firstList);System.out.println("secondList" + secondList);}

测试:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList2(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList2(list1);}

测试结果:
在这里插入图片描述

方法三:stream 流操作 filter 方法过滤

public static void divideList3(List<String> list) {int length = list.size();int mid = length / 2;List<String> firstList = new ArrayList<>();List<String> secondList = new ArrayList<>();// 判断集合元素个数是奇数个if (length % 2 == 1) {firstList = list.stream().filter(str -> Integer.valueOf(str) <= mid + 1).collect(Collectors.toList()); // 获取前半部分 listsecondList = list.stream().filter(str -> Integer.valueOf(str) > mid + 1).collect(Collectors.toList()); // 获取后半部分 list} else {firstList = list.stream().filter(str -> Integer.valueOf(str) <= mid).collect(Collectors.toList()); // 获取前半部分 listsecondList = list.stream().filter(str -> Integer.valueOf(str) > mid).collect(Collectors.toList()); // 获取后半部分 list}System.out.println("firstList" + firstList);System.out.println("secondList" + secondList);}

测试:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList3(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList3(list1);}

测试结果:
在这里插入图片描述

方法四:使用 Google Guava 的 Lists.partition 方法

Lists.partition 方法可以更加灵活的按照几个元素为一组的形式进行分割。

首先,进入 Lists.partition 方法源码:
可以看到,方法需要传入两个参数,其中:list 参数是要分割的集合,size 表示几个元素分割为一组。比如 size 是3,表示拆分成拆分的集合大小为3(即3个元素分为一组),后面不足3的有多少算多少。分割完集合,将分割完的集合封装在一个集合里返回。
在这里插入图片描述

在 pom.xml 中添加依赖:

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

实现代码:

import com.google.common.collect.Lists;public static void divideList4(List<String> list) {int length = list.size();int mid = length / 2;// size 是把集合拆分的大小,size 为表示拆分成拆分的集合大小为3,// 后面不足3的有多少算多少List<List<String>> partition;if (length % 2 == 1) {partition = Lists.partition(list, mid + 1);} else {partition = Lists.partition(list, mid);}System.out.println(partition);}

测试:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList4(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList4(list1);}

测试结果:
在这里插入图片描述

方法五:使用 apache commons 的 ListUtils.partition 方法

apache commons 的 ListUtils.partition 方法使用和 Google Guava 的 Lists.partition 方法大体一致

添加依赖:

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

实现代码:

import org.apache.commons.collections4.ListUtils;public static void divideList5(List<String> list) {int length = list.size();int mid = length / 2;// size 是把集合拆分的大小,size 为表示拆分成拆分的集合大小为3,// 后面不足3的有多少算多少List<List<String>> partition;if (length % 2 == 1) {partition = ListUtils.partition(list, mid + 1);} else {partition = ListUtils.partition(list, mid);}System.out.println(partition);}

测试:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList5(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList5(list1);}

测试结果:
在这里插入图片描述

方法六:使用 Hutool 的 ListUtil.partition 方法

添加依赖:

		<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.14</version></dependency>

实现代码:

import cn.hutool.core.collection.ListUtil;public static void divideList6(List<String> list) {int length = list.size();int mid = length / 2;// size 是把集合拆分的大小,size 为表示拆分成拆分的集合大小为3,// 后面不足3的有多少算多少List<List<String>> partition;if (length % 2 == 1) {partition = ListUtil.partition(list, mid + 1);} else {partition = ListUtil.partition(list, mid);}System.out.println(partition);}

方法七:使用 Java8 的 Collectors.partitioningBy() 方法

实现方法:

   public static void divideList7(List<String> list) {Map<Boolean, List<String>> groups =list.stream().collect(Collectors.partitioningBy(s -> Integer.parseInt(s) > 3));List<List<String>> subSets = new ArrayList<List<String>>(groups.values());System.out.println(subSets);}

测试:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");divideList7(list);System.out.println("========================");List<String> list1 = new ArrayList<>();list1.add("1");list1.add("2");list1.add("3");list1.add("4");list1.add("5");divideList7(list1);}

测试结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/52107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机三级-数据库技术】操作题大题(第六套)

第六套操作题 第46题 假定要建立一个学校科研项目管理的信息系统&#xff0c;需要管理如下信息&#xff1a; 教师&#xff1a;教师编号、教师姓名&#xff1b; 项目&#xff1a;项目编号、项目名称、资助额&#xff1a; 学生&#xff1a;学生编号、学生姓名、学位&#xff0c…

跟李沐学AI:转置卷积

定义 卷积不会增大输入的高宽&#xff0c;通常卷积层后高宽不变或减半。转置卷积则可以用来增大输入的宽高。 转置卷积是一种卷积&#xff0c;它将输入和核进行了重新排列&#xff0c;通常用作上采用。 如果卷积将输入从变为&#xff0c;同样超参数的情况下&#xff0c;转置…

集团数字化转型方案(十二)

集团数字化转型方案致力于通过构建一个集成化的数字平台&#xff0c;全面应用大数据分析、人工智能、云计算和物联网等前沿技术&#xff0c;推动业务流程、管理模式和决策机制的全面升级。该方案将从业务流程的数字化改造开始&#xff0c;优化资源配置&#xff0c;提升运营效率…

yolov8 出现loss 为nan

原因&#xff1a; 混合精度训练是一种通过同时使用 FP16 和 FP32 精度来加速深度学习训练的技术。它可以在不损失模型性能的情况下,显著减少训练时间和内存使用。下面是关于混合精度训练的一些解释: 1. 原理 混合精度训练利用了 FP16 (16位浮点)和 FP32 (32位浮点)的不同特性。…

每日一题——贪心算法

860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 这道题目乍一看可能没有什么头绪&#xff0c;但是当你仔细想想就会明白一个道理&#xff0c;那就是&#xff0c;《论电子支付的重要性》哈哈哈哈&#xff0c;言归正传&#xff0c;其实很简单无非就是找钱&#xff0c;…

Alembic:python中数据库迁移的瑞士军刀

Alembic 简介 Alembic 是由 SQLAlchemy 的创始人 Mike Bayer 设计的一个数据库迁移工具。它不仅支持自动迁移脚本生成&#xff0c;还允许开发者手动编辑迁移脚本来满足特定的需求。Alembic 通过提供一个环境来跟踪数据库模式的变更历史&#xff0c;确保数据库的版本与应用代码…

linux内核 时间同步机理分析笔记

1 内核时间管理的相关组件 1.1 clocksource 和 clock_event_device 1.1.1 简介 外部时钟设备的主要作用是提供精确的计时功能和定期产生中断的功能&#xff0c;内部把提供精确计时的功能抽象为clocksource对象&#xff0c;把定期产生中断的功能抽象为clock_event_device对象…

《黑神话:悟空》全网互动量超1.8亿,百万天命人重走西游

四年磨一剑&#xff0c;一剑破长空。 8月20日10点&#xff0c;《黑神话&#xff1a;悟空》正式开服&#xff0c;同时轰动了国内外游戏圈子&#xff0c;冲顶国内各大社媒平台&#xff0c;一天包揽120个热搜。上线之后&#xff0c;《黑神话&#xff1a;悟空》火速登顶Steam热销游…

克服编程学习中的挫折感:从心态到策略的全方位指南

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、心态调整&#xff1a;积极乐观&#xff0c;合理期望 二、学习方法&#xff1a;有效策…

一起学Java(3)-Java项目构建工具Gradle和Maven场景定位和优缺点对比

在第一步创建的项目&#xff08;java-all-in-one&#xff09;项目里&#xff0c;我们提到了使用Gradle作为项目构建工具。看到这里&#xff0c;不知道你是否有疑惑&#xff0c;什么是项目构建工具。Java项目常用构建工具有哪些&#xff1f;都有什么特点&#xff1f; 带着疑惑&…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm&#xff0c;其他软件也是一样操作 1、进入到pycharm的目录&#xff0c;先通过命令行打开pycharm&#xff1a; ./bin/pycharm…

[Leetcode 61][Medium]-旋转链表

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题链接 二、整体思路 首先发现这样的规律&#xff1a;当k大于等于链表中节点总数n时&#xff0c;会发现此时旋转后的链表和kk%n时的旋转后的链表一样。同时对于特殊情况n0和n1时&#xff0c;无论k的值为多少都可以…

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models

Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…

Prometheus Alertmanager告警之邮件、钉钉群、企业微信群机器人报警

文章目录 一、部署alertmanager相关组件1.alertmanager-config2.alertmanager-message-tmpl3.alertmanager 二、调试邮件告警三、钉钉群/企业微信群 报警3.1添加钉钉群机器人3.2添加企业微信群机器人3.3部署alertmanager-webhook-adaptermessage-tmplalertmanager-webhook-adap…

【PHP入门教程】PHPStudy环境搭建+HelloWorld运行

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 PHP 的历史 PHP&#xff08;Hypertext Preprocessor&#xff09;超文本预处理器是一种开源的通用脚本语…

CART决策树-基尼指数(全网最详解)

文章目录 一、基尼指数的定义二、基尼指数在CART决策树中的应用三、基尼指数与CART决策树的构建1.计算每个子集的基尼系数&#xff1a;2.计算基尼指数3.选择最优特征4.其余基尼指数5.构建决策树 四、总结 CART决策树基尼指数是CART&#xff08;Classification And Regression T…

[C语言]-基础知识点梳理-文件管理

前言 各位师傅们好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解文件管理的相关知识&#xff0c;也就是常见的 读取&#xff0c;删除一类的操作 文件 为什么要使用文件&#xff1f; 程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&…

Godot自定义快捷键(配置视图快捷键)

如图 这个没啥技术&#xff0c;但是配置快捷键的时候有讲究如图 选择万国码并且将前后左右下上&#xff08;顶底&#xff09;分别配置为123456。汝等自管记好&#xff0c;今后自有妙用&#xff08;哈哈&#xff09;效果如图

解决电脑突然断网没网,以太网无网络访问权限,本地连接时出错:地址仍未与网络终结点关联

帮同事处理网络问题&#xff0c;尝试了拔插网线&#xff0c;重启电脑&#xff0c;禁用启用以太网&#xff0c;都没有解决。 于是在**命令提示符(cmd)**中执行命令&#xff1a; ipconfig /release 按回车执行后&#xff0c;返回提示&#xff1a;本地连接时出错&#xff1a;地址…

什么是GD32 MCU读保护?

如今电子产品市场风云变幻&#xff0c;暗流汹涌&#xff0c;有没有小伙伴遇到自己费了大力气写出来的代码&#xff0c;很容易就被别人“借鉴”了&#xff0c;真的是让闻者伤心&#xff0c;听着落泪啊。 那有没有什么方法可以防止别人将你的代码从MCU读出来呢&#xff1f;答案当…