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(); } } } }
这段代码的执行流程是:
- 第一次循环,Thomas的时间273比初始的
Integer.MAX_VALUE小,所以打印Thomas的信息,同时更新fastestTime为273。 - 第二次循环,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
相关产品推荐
相关产品推荐

