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

Java入门自学MIT旧课程:代码返回双结果而非最快跑者原因咨询

问题分析与解决方案

嘿,刚学Java遇到这种逻辑问题太正常了,我来帮你捋清楚~

从你给出的输出Thomas: 273 John: 243来看,你的代码大概率是在遍历跑者数据的过程中,每发现一个比当前记录更快的跑者就直接打印了,而不是先找出真正最快的那个,最后再统一输出。

举个例子,我还原一下你可能的错误写法:

// 模拟你的错误代码逻辑
class Runner {
    private String name;
    private int time;

    public Runner(String name, int time) {
        this.name = name;
        this.time = time;
    }

    public String getName() { return name; }
    public int getTime() { return time; }
}

public class Main {
    public static void main(String[] args) {
        Runner[] runners = {new Runner("Thomas", 273), new Runner("John", 243)};
        int fastestTime = Integer.MAX_VALUE; // 初始设为最大整数

        for (Runner runner : runners) {
            // 每次发现时间更短的(更快的)跑者就直接打印
            if (runner.getTime() < fastestTime) {
                System.out.println(runner.getName() + ": " + runner.getTime());
                fastestTime = runner.getTime();
            }
        }
    }
}

这段代码的执行流程是:

  1. 第一次循环,Thomas的时间273比初始的Integer.MAX_VALUE小,所以打印Thomas的信息,同时更新fastestTime为273。
  2. 第二次循环,John的时间243比273小,又满足条件,所以再次打印John的信息,更新fastestTime为243。
    这样自然会输出两个结果,而不是你想要的唯一最快者。

修正方案

正确的思路应该是先遍历所有跑者,找到速度最快的那一个(时间最短的),最后只打印这一个结果,代码示例如下:

class Runner {
    private String name;
    private int time;

    public Runner(String name, int time) {
        this.name = name;
        this.time = time;
    }

    public String getName() { return name; }
    public int getTime() { return time; }
}

public class Main {
    public static void main(String[] args) {
        Runner[] runners = {new Runner("Thomas", 273), new Runner("John", 243)};
        // 先假设第一个跑者是最快的
        Runner fastestRunner = runners[0];

        for (Runner runner : runners) {
            // 比较当前跑者和已记录的最快跑者的时间
            if (runner.getTime() < fastestRunner.getTime()) {
                // 如果当前跑者更快,更新最快跑者的记录
                fastestRunner = runner;
            }
        }

        // 遍历结束后,只打印最终的最快跑者
        System.out.println(fastestRunner.getName() + ": " + fastestRunner.getTime());
    }
}

这样执行后就只会输出John: 243,也就是真正的最快跑者啦~

核心区别在于:错误写法是边遍历边输出阶段性结果,而正确写法是先遍历记录最终结果,再输出一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:30:31