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

Java作业问题:按阈值移除数组中Home对象的方法异常排查

解决Java数组移除Home对象的异常问题

嘿,我看你这个问题挺典型的——数组移除元素时很容易踩的坑!先帮你拆解下问题根源,再给你靠谱的修复方案。

问题根源分析

从你给出的代码片段来看,最可能导致“有时移除、有时未移除”的原因有两个:

  1. 数组越界异常:你的while循环条件顺序搞反了!你写的是(this.homeList[index].costPerMonth() < cost) && (index < this.numHomes),Java的逻辑与是短路判断,但这里是先访问数组元素,再判断index是否在合法范围内。当index等于numHomes时,直接访问homeList[index]会抛出ArrayIndexOutOfBoundsException,如果没有捕获这个异常,方法会直接终止,后面的元素根本没机会处理;如果有捕获,后续循环也会中断,导致部分元素没被移除。
  2. 逻辑判断模糊:你要移除的是每月成本高于阈值的对象,但代码里判断的是costPerMonth() < cost,等于阈值的对象会被保留,这本身没问题,但表述不够清晰,容易混淆逻辑。

修复方案

方案1:修复原有的do-while逻辑

调整条件顺序,避免越界,同时明确判断逻辑:

public int remove(double cost) {
    int count = 0;
    int index;
    do {
        index = 0;
        // 先判断index是否在合法范围内,再访问数组元素,彻底避免越界
        while (index < this.numHomes && this.homeList[index].costPerMonth() <= cost) {
            // 保留<=阈值的元素,找到第一个需要移除的元素(>阈值)
            index++;
        }
        if (index < this.numHomes) {
            // 移除index位置的元素:将后续元素前移一位
            for (int i = index; i < this.numHomes - 1; i++) {
                this.homeList[i] = this.homeList[i + 1];
            }
            this.numHomes--;
            count++;
        }
    } while (index < this.numHomes);
    return count;
}

方案2:更高效的单遍历实现(推荐)

这种方式只需要遍历一次数组,把需要保留的元素移到数组前端,效率更高,也不会有越界或跳过元素的问题:

public int remove(double cost) {
    int keepIndex = 0;
    // 遍历所有现有Home对象
    for (int i = 0; i < this.numHomes; i++) {
        if (this.homeList[i].costPerMonth() <= cost) {
            // 保留符合条件的对象,放到keepIndex位置
            this.homeList[keepIndex] = this.homeList[i];
            keepIndex++;
        }
        // 不符合条件的直接跳过,不保留
    }
    // 计算移除的数量,更新有效元素个数
    int removedCount = this.numHomes - keepIndex;
    this.numHomes = keepIndex;
    return removedCount;
}

验证建议

你可以测试这两种方案:

  • 测试包含连续多个需要移除的Home对象的场景
  • 测试阈值等于某个Home的每月成本的场景
  • 测试所有对象都需要移除/都不需要移除的边界场景

这样就能确保所有符合条件的对象都被正确移除啦!

内容的提问来源于stack exchange,提问作者C. Liff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:38:38