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

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

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

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YD_1989

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值