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

Dart:从Iterable中移除元素直至满足指定条件

解决方案

首先需要明确:Dart 的 Iterable 本身是不可变的,无法直接移除元素,所以第一步需要将其转换为可修改的 List。针对你的需求,虽然没有完全匹配的内置函数,但可以通过封装扩展方法的方式实现优雅的调用,同时保证逻辑简洁高效。

实现思路

  1. 将 Iterable<MyClass> 转为 List,以便修改元素;
  2. 计算所有元素 data 属性的字符总长度;
  3. 从列表末尾开始移除元素,每次移除后更新总长度,直到总长度低于设定阈值。

代码实现

首先定义 MyClass 示例:

class MyClass {
  final String data;
  MyClass(this.data);
}

然后为 Iterable<MyClass> 添加扩展方法:

extension TrimIterableByDataLength on Iterable<MyClass> {
  List<MyClass> trimToDataThreshold(int threshold) {
    final list = toList();
    int totalLength = fold(0, (sum, item) => sum + item.data.length);

    // 从末尾移除元素直到总长度低于阈值
    while (totalLength >= threshold && list.isNotEmpty) {
      final removedItem = list.removeLast();
      totalLength -= removedItem.data.length;
    }

    return list;
  }
}

使用方式

调用时只需一行代码,非常简洁:

void main() {
  final items = [
    MyClass("Hello"),
    MyClass("World"),
    MyClass("Dart"),
  ];
  final threshold = 10;
  
  final trimmedItems = items.trimToDataThreshold(threshold);
  // 最终剩余 ["Hello"],总长度5 < 10
}

说明

  • 这种方式的时间复杂度是 O(n),只需要遍历到满足条件的位置就停止,效率很高;
  • 扩展方法的封装让调用逻辑更优雅,符合 Dart 的代码风格;
  • 如果初始总长度已经低于阈值,会直接返回原列表,无需任何修改。

内容的提问来源于stack exchange,提问作者progNewbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:16:21