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
相关产品推荐
相关产品推荐

