Dart如何提取嵌套列表元素 修复递归快排返回嵌套数组问题
Dart递归实现快排返回嵌套数组问题修复
问题原因
当前快排实现的返回逻辑直接将递归调用得到的less排序结果、基准值pivot、greater排序结果用方括号包裹为新列表。由于递归调用quickSort本身返回的就是列表类型,直接将列表作为元素放入新列表,就会产生多层嵌套结构,最终输出[[1], 2, [[], 4, [[7], 9, [12]]]]这类不符合预期的结果。
修复方案
不需要额外编写嵌套列表展平逻辑,只需要在拼接返回结果时,将递归返回的列表元素展开到当前列表层级即可,有两种常用实现方式:
- 使用Dart的展开运算符
...(推荐,写法简洁) - 使用列表的
addAll方法逐段拼接(兼容低版本Dart环境)
修复后完整代码
void main(List<String> arguments) { List myList = [2, 4, 9, 7, 1, 12]; print(quickSort(myList)); } List quickSort(var arr){ if (arr.length < 2){ return arr; } else { int pivot = arr[0]; List less = []; List greater = []; arr.removeAt(0); arr.forEach((element) { if (element > pivot){ greater.add(element); } else { less.add(element); } }); // 展开递归返回的列表元素,避免嵌套 return [...quickSort(less), pivot, ...quickSort(greater)]; } }
低版本兼容写法
如果你的运行环境不支持展开运算符,可以将返回逻辑替换为addAll拼接的方式:
List result = []; result.addAll(quickSort(less)); result.add(pivot); result.addAll(quickSort(greater)); return result;
运行修复后的代码,将直接输出期望的一维有序列表:[1, 2, 4, 7, 9, 12]。
内容的提问来源于stack exchange,提问作者Dmitrii Domrachev
相关产品推荐
相关产品推荐

