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

为何满足条件时getBestFare()仍返回null?求技术排查

问题修复:getBestFare() 始终返回null的解决办法

核心问题分析

  1. getBestFare() 逻辑完全错误
    原方法的循环逻辑既没正确找到最低价格选项,也没在遍历结束后返回结果:
  • 初始num=0,循环从i=0开始,第一次比较无意义;
  • 就算找到更低价格的选项,直接返回的仍是初始num=0对应的选项,而非当前低价选项;
  • 若循环中未触发任何return,就会走到最后返回null。
  1. getRidePrices() 计算逻辑错误
    原price2的计算属于冗余化简,且未正确计算7天票的单次乘车成本:
double price2 = ((cost[1]*unlimited7Price()) / (unlimited7Price() * 7));

化简后等价于cost[1]/7,这不是基于总乘车次数的单次成本,完全不符合需求。

  1. 构造函数参数校验缺陷
    当参数无效时,仅打印提示但未终止对象初始化,会导致numberOfDays和transCount保持默认值0,后续计算出现异常。

修复后的完整代码

public class TransitCalculator {
    public int numberOfDays;
    public int transCount;

    public TransitCalculator(int numberOfDays, int transCount) {
        if (numberOfDays <= 30 && numberOfDays > 0 && transCount > 0) {
            this.numberOfDays = numberOfDays;
            this.transCount = transCount;
        } else {
            throw new IllegalArgumentException("Invalid data: numberOfDays must be 1-30, transCount must be positive");
        }
    }

    String[] fareOptions = {"Pay-per-ride", "7-day Unlimited", "30-day Unlimited"};
    double[] baseCosts = {2.75, 33.00, 127.00};

    public double calculateUnlimited7TotalCost() {
        int weekCount = numberOfDays / 7;
        if (numberOfDays % 7 > 0) {
            weekCount += 1;
        }
        return weekCount * baseCosts[1];
    }

    public double[] getPerRideCosts() {
        // 单次票成本
        double payPerRide = baseCosts[0];
        // 7天票总花费 / 总乘车次数 = 单次成本
        double unlimited7PerRide = calculateUnlimited7TotalCost() / transCount;
        // 30天票总花费 / 总乘车次数 = 单次成本
        double unlimited30PerRide = baseCosts[2] / transCount;

        return new double[]{payPerRide, unlimited7PerRide, unlimited30PerRide};
    }

    public String getBestFare() {
        double[] perRideCosts = getPerRideCosts();
        int bestIndex = 0;

        // 遍历找到最低单次成本的选项索引
        for (int i = 1; i < perRideCosts.length; i++) {
            if (perRideCosts[i] < perRideCosts[bestIndex]) {
                bestIndex = i;
            }
        }

        // 返回格式化结果
        return String.format("You should get the %s option at $%.2f per ride.",
                fareOptions[bestIndex],
                perRideCosts[bestIndex]);
    }

    public static void main(String[] args) {
        TransitCalculator calculator = new TransitCalculator(30, 30);

        System.out.println("7-day unlimited total cost: " + calculator.calculateUnlimited7TotalCost());
        System.out.println("30-day unlimited per ride cost: " + calculator.getPerRideCosts()[2]);
        System.out.println(calculator.getBestFare());
    }
}

修复要点说明

  • getBestFare() 逻辑修正:先遍历所有选项找到最低成本的索引,再统一返回结果,避免中途错误返回;同时缓存getPerRideCosts()的结果,避免重复计算。
  • getPerRideCosts() 计算修正:正确计算每种票的单次乘车成本(总花费除以总乘车次数)。
  • 构造函数优化:参数无效时抛出异常,避免后续计算使用无效的默认值。
  • 命名优化:修改变量名使其更具可读性(如length改为fareOptions,cost改为baseCosts)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:25:39