Java ArrayStats类统计连续相同元素组功能故障及Runner类求助
修正数组连续相同元素组统计的Java代码问题
需求明确
先把需求再梳理清楚,避免理解偏差:
给定一个整数数组,统计指定大小size的连续相同元素组数量,规则如下:
- 连续相同值的序列称为一个「块」,例如
[1,1,1]是长度为3的块- 一个长度为L的块,会被计入所有size ≤ L的统计中(比如长度3的块会被算入size=1、size=2、size=3的统计)
- 最终统计结果是:对于指定size,数组中所有长度≥size的块的数量
用用户给出的两个示例验证:
- 数组
[1,1,1,2,2,2,3,3,3,4,5,6,7]:- size=1:共7个块(3个长度3的块 + 4个长度1的块)→ count=7
- size=2:只有3个长度≥2的块 → count=3
- size=3:只有3个长度≥3的块 → count=3
- 数组
[3,3,3,3,3,9,4,4,4,5,5,5,5,6,6,7,7,7,8,8,8,8,8,8,8,8]:- size=1 → 7个块 → count=7
- size=2 → 6个块(排除长度1的
[9])→ count=6 - size=3 →5个块(排除长度1的
[9]和长度2的[6,6])→ count=5 - size=4 →3个块(仅保留长度≥4的
[3,3,3,3,3]、[5,5,5,5]、[8,...8])→ count=3 - size=5 →2个块(保留长度≥5的
[3,3,3,3,3]、[8,...8])→ count=2 - size=6 →1个块(仅保留长度≥6的
[8,...8])→ count=1
原代码问题分析
原ArrayStats类的getNumGroupsOfSize方法存在核心问题:
- 没有接收
size参数,无法针对不同大小做统计 - 逻辑完全偏离需求:通过相邻元素相等计数
cnt,再用无意义的j循环赋值number,完全不贴合块长度统计的逻辑 toString方法输出格式混乱,无法清晰展示数组和统计结果
原ArrayStatsRunner未完成,无法遍历不同size并输出符合要求的结果
修正后的完整代码
ArrayStats类
import java.util.Arrays; public class ArrayStats { private int[] numArray; // 构造函数初始化数组 public ArrayStats(int[] a) { setArray(a); } // 设置数组,做拷贝避免外部修改内部数据 public void setArray(int[] a) { numArray = Arrays.copyOf(a, a.length); } // 核心方法:统计长度≥size的连续相同元素块的数量 public int getNumGroupsOfSize(int size) { if (size <= 0 || numArray.length == 0) { return 0; } int groupCount = 0; int currentBlockLength = 1; // 遍历数组,统计每个连续块的长度 for (int i = 1; i < numArray.length; i++) { if (numArray[i] == numArray[i - 1]) { currentBlockLength++; } else { // 当前块结束,判断是否符合size要求 if (currentBlockLength >= size) { groupCount++; } currentBlockLength = 1; } } // 处理最后一个未统计的块 if (currentBlockLength >= size) { groupCount++; } return groupCount; } @Override public String toString() { return "数组内容: " + Arrays.toString(numArray); } }
ArrayStatsRunner类
public class ArrayStatsRunner { public static void main(String[] args) { // 测试用户提供的第二个示例数组 int[] testArray = {3, 3, 3, 3, 3, 9, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8}; ArrayStats stats = new ArrayStats(testArray); System.out.println(stats); // 遍历需要统计的size范围(从1到数组中最大块的长度8) for (int size = 1; size <= 8; size++) { int count = stats.getNumGroupsOfSize(size); System.out.printf("size %d count == %d%n", size, count); } // 可选:测试第一个示例数组 System.out.println("\n--- 测试第一个示例数组 ---"); int[] testArray2 = {1,1,1,2,2,2,3,3,3,4,5,6,7}; ArrayStats stats2 = new ArrayStats(testArray2); System.out.println(stats2); for (int size = 1; size <=3; size++) { int count = stats2.getNumGroupsOfSize(size); System.out.printf("size %d count == %d%n", size, count); } } }
关键逻辑说明
- 连续块长度统计:在
getNumGroupsOfSize方法中,用currentBlockLength变量跟踪当前连续相同元素块的长度 - 块结束判断:遇到不同元素时,检查当前块长度是否≥指定size,符合则计数+1
- 边界处理:对size≤0或空数组直接返回0,避免异常;遍历结束后单独处理最后一个块
- Runner类功能:初始化测试数组,遍历不同size调用统计方法,输出完全符合用户要求的格式结果
运行修正后的代码,会输出和用户示例完全一致的统计结果。
内容的提问来源于stack exchange,提问作者NightCode
相关产品推荐
相关产品推荐

