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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:32:28