当前位置:首页 » 《关于电脑》 » 正文

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

5 人参与  2024年10月12日 17:21  分类 : 《关于电脑》  评论

点击全文阅读


文章目录

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 = list.subList(0, mid + 1); // 获取前半部分 list            secondList = list.subList(mid + 1, list.size()); // 获取后半部分 list        } else {            firstList = list.subList(0, mid); // 获取前半部分 list            secondList = 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()); // 获取前半部分 list            secondList = 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()); // 获取前半部分 list            secondList = 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://zhangshiyu.com/post/171119.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 残月照孤影:结局+番外:全书+后续+结局(秦瑶光秦煜泽)列表_残月照孤影:结局+番外(秦瑶光秦煜泽)残月照孤影:结局+番外:全书+后续+结局在线
  • 褪色的爱不要也罢精彩剧情(顾明月)全书浏览_褪色的爱不要也罢精彩剧情全书浏览
  • 微风轻拂又见你:全书+番外(林书意陆沉)全书林书意陆沉结局_林书意陆沉结局列表_笔趣阁(微风轻拂又见你:全书+番外)
  • 「三国:貂蝉是刺客?甘夫人要帮忙?」番外特辑限免解锁_「刘珣」章节免费试读
  • 心似秋叶渐飘零纯净版:结局+番外(詹静苏睿)全书浏览_心似秋叶渐飘零纯净版:结局+番外全书浏览
  • 陆真真的重生后我打脸男友的绿茶青梅陆真真全书在线
  • 出国后,前妻对我穷追不舍:结局+番外(云晚晚顾迟云)_(出国后,前妻对我穷追不舍:结局+番外)列表_笔趣阁(云晚晚顾迟云)
  • 抛夫弃子求真爱,被白月光渣了你找我?小说无删减版在线免费阅读_林过溪吴若雨免费试读
  • 摘星揽月莫回首:+番外+后续列表_摘星揽月莫回首:+番外+后续(沈竹妍裴绪谨)
  • 微风轻拂又见你:结局+番外(林书意陆沉)结局_(微风轻拂又见你:结局+番外全书结局)结局列表_笔趣阁(林书意陆沉)
  • (番外)+(全书)林书意陆沉:结局+番外林书意陆沉_林书意陆沉完本全(林书意陆沉:结局+番外)
  • 相思烬落冥河渡:结局+番外(叶流萤冥渊)_(相思烬落冥河渡叶流萤冥渊:结局+番外)相思烬落冥河渡叶流萤冥渊:结局+番外列表_笔趣阁(叶流萤冥渊)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1