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

Java ArrayStats类统计连续相同元素组功能故障及Runner类求助

修正数组连续相同元素组统计的Java代码问题

需求明确

先把需求再梳理清楚,避免理解偏差:

给定一个整数数组,统计指定大小size的连续相同元素组数量,规则如下:

  • 连续相同值的序列称为一个「块」,例如[1,1,1]是长度为3的块
  • 一个长度为L的块,会被计入所有size ≤ L的统计中(比如长度3的块会被算入size=1、size=2、size=3的统计)
  • 最终统计结果是:对于指定size,数组中所有长度≥size的块的数量

用用户给出的两个示例验证:

  1. 数组[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
  2. 数组[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);
        }
    }
}

关键逻辑说明

  1. 连续块长度统计:在getNumGroupsOfSize方法中,用currentBlockLength变量跟踪当前连续相同元素块的长度
  2. 块结束判断:遇到不同元素时,检查当前块长度是否≥指定size,符合则计数+1
  3. 边界处理:对size≤0或空数组直接返回0,避免异常;遍历结束后单独处理最后一个块
  4. Runner类功能:初始化测试数组,遍历不同size调用统计方法,输出完全符合用户要求的格式结果

运行修正后的代码,会输出和用户示例完全一致的统计结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:03:16