You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中将数组划分为n个分区无元素遗漏的for循环修改方法

问题原因

你的代码出现元素丢失的核心是Java的整数除法会舍弃余数:示例中数组长度10,分区数4,10/4=2,按你原来的逻辑总共只会遍历4*2=8个元素,剩下的余数2对应的元素9、10就被漏掉了。

修改方案

方案1:剩余元素全部放入最后一个分区(最简单修改)

只需要调整内层循环的右边界,最后一个分区直接以数组长度作为结束边界即可,修改后的代码如下:

public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int[] part = {0, 1, 2, 3};
    int baseSize = a.length / part.length;
    for (int i = 0; i < part.length; i++) {
        int start = baseSize * part[i];
        // 最后一个分区直接取数组总长度作为右边界
        int end = (i == part.length - 1) ? a.length : baseSize * (part[i] + 1);
        for (int j = start; j < end; j++) {
            System.out.print(a[j] + " ");
        }
        System.out.println();
    }
}

运行输出:

1 2 
3 4 
5 6 
7 8 9 10 

所有元素都能被正常遍历。

方案2:余数均匀分摊到前N个分区(分区大小更均匀)

如果不希望最后一个分区比其他分区大太多,可以把整除得到的余数,依次分摊到前k个分区(k等于余数大小),每个分区的大小差不会超过1,代码如下:

public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int[] part = {0, 1, 2, 3};
    int partitionCount = part.length;
    int remainder = a.length % partitionCount;
    int currentOffset = 0;
    for (int i = 0; i < partitionCount; i++) {
        // 前remainder个分区每个多分配1个元素
        int currentSize = a.length / partitionCount + (i < remainder ? 1 : 0);
        for (int j = currentOffset; j < currentOffset + currentSize; j++) {
            System.out.print(a[j] + " ");
        }
        currentOffset += currentSize;
        System.out.println();
    }
}

运行输出:

1 2 3 
4 5 6 
7 8 
9 10 

内容的提问来源于stack exchange,提问作者Edd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 21:57:03