如何在Dart中从给定列表生成指定结构的目标列表?
在Dart中实现该需求的最优方法
这需求本质就是把原数组的前k项子数组(k从1到原数组的长度)依次拼接起来对吧?在Dart里有两种比较优雅的实现方式,看你更偏好函数式风格还是直观的循环写法:
方法一:用expand函数式实现(简洁首选)
这种写法代码更紧凑,符合Dart的函数式编程风格:
void main() { var numbers = ["1","2","3","4","5"]; var targetList = numbers.asMap().entries.expand((entry) { // 利用索引+1来确定要取的前n项 return numbers.take(entry.key + 1); }).toList(); print(targetList); // 输出结果:["1","1","2","3","1","2","3","1","2","3","4","1","2","3","4","5"] }
代码解释:
numbers.asMap():把原数组转换成{索引: 元素}的Map,这样我们能获取每个元素对应的位置信息。expand():核心方法,它会把每个输入的entry展开成一个可迭代对象,最后将所有展开的内容合并成一个大的可迭代集合。numbers.take(entry.key + 1):因为索引从0开始,所以用key+1来指定要取原数组的前n项,比如第一个entry对应取前1项,第二个对应前2项,以此类推。toList():把最终的可迭代对象转换成List,得到目标数组。
方法二:用循环实现(直观易懂)
如果觉得函数式写法有点绕,循环的方式更直白,逻辑一眼就能看明白:
void main() { var numbers = ["1","2","3","4","5"]; var targetList = <String>[]; for (int i = 1; i <= numbers.length; i++) { // 每次取前i项,添加到目标列表里 targetList.addAll(numbers.take(i)); } print(targetList); }
复杂度说明
两种方法的时间复杂度都是O(n²),这是这个需求的必然结果——因为最终目标数组的长度是1+2+3+...+n = n(n+1)/2,必须遍历这么多元素才能生成。所以这两种方法都是当前需求下的最优实现,选哪种全看个人代码风格偏好~
内容的提问来源于stack exchange,提问作者vicky_prog
相关产品推荐
相关产品推荐

