Dart代码无法正确打印列表第二大数,请求排查错误原因
Dart代码求第二大数的错误排查与修复
原代码的核心错误
- 方法调用错误:
a.sort未加括号,sort是List的成员方法,必须通过a.sort()调用才会执行排序操作,原写法仅引用了方法对象,并未实际对列表排序。 - 冗余且逻辑混乱的嵌套循环:三层
for-in循环完全没必要,循环中使用的max、second_last是遍历列表的临时变量,修改它们的值无法起到跟踪最值的作用,每次循环都会重置变量,导致逻辑彻底混乱。 - 错误的判断触发:在错误的循环结构下,
x > second_last && x != max的条件会多次匹配列表中的非首尾元素,最终输出一堆无关内容。
修复后的实现方案
方案1:排序后取第二大数(需处理重复元素)
先对列表排序,再从后往前找到第一个不等于最大值的元素,即为第二大数:
void main() { List<int> a = [9,6,4,10,13,2,3,5]; // 执行升序排序 a.sort(); int maxValue = a.last; // 从倒数第二个元素往前遍历,找到第一个不等于最大值的元素 for (int i = a.length - 2; i >= 0; i--) { if (a[i] != maxValue) { print(a[i]); break; } } }
方案2:一次遍历找最值(时间复杂度O(n),更高效)
无需排序,遍历一次列表即可同时跟踪最大值和第二大数,处理重复元素也更稳妥:
void main() { List<int> a = [9,6,4,10,13,2,3,5]; int max = -double.infinity.toInt(); int secondMax = -double.infinity.toInt(); for (int num in a) { if (num > max) { // 当前数比最大值大,把原最大值降级为第二大 secondMax = max; max = num; } else if (num > secondMax && num != max) { // 当前数比第二大值大,但不等于最大值,更新第二大值 secondMax = num; } } print(secondMax); }
内容的提问来源于stack exchange,提问作者Omar Khattab
相关产品推荐
相关产品推荐

