0

0

Java实现列表均匀分块策略:对标Numpy array_split

花韻仙語

花韻仙語

发布时间:2025-09-05 16:21:02

|

1057人浏览过

|

来源于php中文网

原创

Java实现列表均匀分块策略:对标Numpy array_split

本文探讨了在Java中如何将一个列表(或数组)均匀地分割成指定数量的子列表,以模拟Python NumPy库中array_split函数的行为。我们将介绍一种基于Guava库Lists.partition方法的实现策略,通过精确计算每个子列表的最大容量,实现灵活且高效的数据分块处理,适用于并行处理或数据分页等场景。

1. 理解需求:Numpy array_split 的行为

python的numpy库中,numpy.array_split(array, n) 函数能够将一个数组分割成 n 个大致相等的子数组。即使数组的长度不能被 n 整除,它也会尽量使子数组的大小均匀分布,例如:

>>> import numpy
>>> x = [7, 3, 9, 10, 5, 6, 8, 13] # 长度为8的列表
>>> numpy.array_split(x, 3) # 分割成3个子数组
[array([7, 3, 9]), array([10,  5,  6]), array([ 8, 13])]

在这个例子中,一个包含8个元素的列表被分成了3个子列表,其长度分别为3、3、2。这种“按数量分块”的需求在Java中进行数据并行处理或分页时非常常见。

2. Java 实现策略:结合 Guava Lists.partition

Java标准库中没有直接对应 numpy.array_split 的函数。然而,通过巧妙地结合 Guava 库的 Lists.partition 方法和数学计算,我们可以实现相同的逻辑。

Lists.partition(list, size) 方法的作用是将一个列表分割成若干个子列表,每个子列表的最大长度为 size。最后一个子列表的长度可能会小于 size。 为了模拟 array_split 的“分割成 n 块”行为,我们需要首先计算出每个子列表的 最大容量 size,使得原始列表能够被分割成恰好 n 块。

2.1 计算子列表的最大容量

假设原始列表的长度为 totalSize,我们希望将其分割成 numberOfChunks 个子列表。 每个子列表的最大容量 sublistMaxSize 可以通过以下公式计算:

sublistMaxSize = Math.ceil(totalSize / (double) numberOfChunks)

这里使用 (double) 进行浮点除法,并使用 Math.ceil 向上取整。这样做的目的是确保:

立即学习Java免费学习笔记(深入)”;

  • 如果 totalSize 能被 numberOfChunks 整除,sublistMaxSize 就是精确的平均值。
  • 如果不能整除,sublistMaxSize 会向上取整,这意味着每个子列表(除了最后一个可能较小)都将拥有这个最大容量,从而保证最终的子列表数量不会超过 numberOfChunks,并且会是期望的 numberOfChunks。

例如,对于长度为8的列表和3个分块: sublistMaxSize = Math.ceil(8 / 3.0) = Math.ceil(2.66...) = 3 这意味着每个子列表的最大容量为3。

2.2 使用 Lists.partition 进行分割

计算出 sublistMaxSize 后,我们就可以直接使用 Lists.partition 方法:

List> partitionedLists = Lists.partition(originalList, sublistMaxSize);

这将返回一个包含所有子列表的列表。

科大讯飞-AI虚拟主播
科大讯飞-AI虚拟主播

科大讯飞推出的移动互联网智能交互平台,为开发者免费提供:涵盖语音能力增强型SDK,一站式人机智能语音交互解决方案,专业全面的移动应用分析;

下载

3. 示例代码

以下是一个完整的Java示例,演示如何使用Guava库实现Numpy array_split 的功能:

首先,确保你的项目中已添加Guava依赖。如果你使用Maven,可以在 pom.xml 中添加:


    com.google.guava
    guava
    32.1.3-jre 

然后,是实现代码:

import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListSplitterExample {

    /**
     * 将一个列表分割成指定数量的子列表,模拟Numpy的array_split行为。
     *
     * @param originalList 原始列表
     * @param numberOfChunks 期望的子列表数量
     * @param  列表中元素的类型
     * @return 包含所有子列表的列表
     * @throws IllegalArgumentException 如果 numberOfChunks 小于等于 0
     */
    public static  List> splitListIntoChunks(List originalList, int numberOfChunks) {
        if (numberOfChunks <= 0) {
            throw new IllegalArgumentException("子列表数量必须大于0。");
        }
        if (originalList.isEmpty()) {
            return new ArrayList<>(); // 空列表直接返回空结果
        }

        // 计算原始列表的总长度
        int totalSize = originalList.size();

        // 计算每个子列表的最大容量
        // 使用Math.ceil确保向上取整,以保证最终的子列表数量不会超过numberOfChunks
        int sublistMaxSize = (int) Math.ceil(totalSize / (double) numberOfChunks);

        // 使用Guava的Lists.partition方法进行分割
        // Lists.partition会创建固定大小的子列表,最后一个可能较小
        // 由于我们精确计算了sublistMaxSize,最终的子列表数量将是numberOfChunks
        return Lists.partition(originalList, sublistMaxSize);
    }

    public static void main(String[] args) {
        // 示例数据
        List data = Arrays.asList(7, 3, 9, 10, 5, 6, 8, 13);
        int chunks = 3; // 期望分割成3个子列表

        System.out.println("原始列表: " + data);
        System.out.println("期望分块数量: " + chunks);

        // 调用分块方法
        List> partitionedData = splitListIntoChunks(data, chunks);

        System.out.println("分割后的子列表:");
        for (int i = 0; i < partitionedData.size(); i++) {
            System.out.println("  子列表 " + (i + 1) + ": " + partitionedData.get(i));
        }

        // 另一个示例:分割成5个子列表
        List words = Arrays.asList("apple", "banana", "cherry", "date", "elderberry", "fig", "grape");
        int wordChunks = 5;
        System.out.println("\n--- 另一个示例 ---");
        System.out.println("原始列表: " + words);
        System.out.println("期望分块数量: " + wordChunks);
        List> partitionedWords = splitListIntoChunks(words, wordChunks);
        System.out.println("分割后的子列表:");
        for (int i = 0; i < partitionedWords.size(); i++) {
            System.out.println("  子列表 " + (i + 1) + ": " + partitionedWords.get(i));
        }

        // 边缘情况:分块数量大于列表长度
        List smallList = Arrays.asList(1, 2, 3);
        int smallListChunks = 5;
        System.out.println("\n--- 边缘情况:分块数量大于列表长度 ---");
        System.out.println("原始列表: " + smallList);
        System.out.println("期望分块数量: " + smallListChunks);
        List> partitionedSmallList = splitListIntoChunks(smallList, smallListChunks);
        System.out.println("分割后的子列表:");
        for (int i = 0; i < partitionedSmallList.size(); i++) {
            System.out.println("  子列表 " + (i + 1) + ": " + partitionedSmallList.get(i));
        }
    }
}

输出示例:

原始列表: [7, 3, 9, 10, 5, 6, 8, 13]
期望分块数量: 3
分割后的子列表:
  子列表 1: [7, 3, 9]
  子列表 2: [10, 5, 6]
  子列表 3: [8, 13]

--- 另一个示例 ---
原始列表: [apple, banana, cherry, date, elderberry, fig, grape]
期望分块数量: 5
分割后的子列表:
  子列表 1: [apple, banana]
  子列表 2: [cherry, date]
  子列表 3: [elderberry]
  子列表 4: [fig]
  子列表 5: [grape]

--- 边缘情况:分块数量大于列表长度 ---
原始列表: [1, 2, 3]
期望分块数量: 5
分割后的子列表:
  子列表 1: [1]
  子列表 2: [2]
  子列表 3: [3]

可以看到,当期望分块数量为3时,8个元素的列表被分成了 [3, 3, 2] 三个子列表,与Numpy的行为一致。当期望分块数量为5时,7个元素的列表被分成了 [2, 2, 1, 1, 1] 五个子列表,也符合预期。

4. 注意事项与总结

  • Guava依赖:此方法依赖于Google Guava库。如果项目中不允许引入第三方库,则需要手动实现分块逻辑,这会稍微复杂一些,需要循环和 subList() 方法来完成。
  • 性能:Lists.partition 返回的是原列表的视图(view),而不是创建新的子列表拷贝。这意味着它具有较高的性能,并且内存开销较小。对返回的子列表的修改会影响原始列表。如果需要独立的子列表,应该进行深拷贝。
  • 空列表和分块数量:示例代码已处理了空列表和 numberOfChunks
  • 通用性:splitListIntoChunks 方法是泛型的,可以处理任何类型的列表。

通过这种结合数学计算和Guava Lists.partition 的策略,我们可以在Java中优雅且高效地实现类似于Numpy array_split 的列表分块功能,这对于处理大规模数据、实现并行计算任务或构建分页逻辑都非常有用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

261

2024.05.29

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1898

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2091

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1060

2024.11.28

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

101

2025.10.23

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号