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

如何合并Dart列表中两个null值间元素并替换原列表对应位置

解决方案

你当前的groupByNull方法仅提取了两个null之间的元素组,但丢失了原列表中null的位置信息,所以没办法直接对应回原列表完成替换。要实现需求,更高效的方式是在遍历列表时直接处理合并逻辑,同时保留null的位置,以下是具体实现:

实现思路

  1. 维护一个临时缓冲区存储两个null之间的非null元素,以及一个结果列表用于生成最终输出。
  2. 遍历原列表的每个元素:
    • 遇到null时:如果缓冲区里有元素,先按规则合并这些元素,将合并结果加入结果列表;再把null加入结果列表,最后清空缓冲区。
    • 遇到非null元素时:直接加入缓冲区。
  3. 遍历结束后,如果缓冲区还有剩余元素(比如列表末尾不是null的情况),也要合并后加入结果列表。

这样既保留了原列表中null的位置,又完成了中间元素的合并。

代码实现

下面是支持自定义合并逻辑的通用扩展方法,你可以根据需求传入合并规则:

extension MergeBetweenNulls<T, R> on List<T?> {
  List<R?> mergeBetweenNulls(R Function(List<T>) mergeFunction) {
    final result = <R?>[];
    final buffer = <T>[];

    for (final element in this) {
      if (element == null) {
        if (buffer.isNotEmpty) {
          result.add(mergeFunction(buffer));
          buffer.clear();
        }
        result.add(null);
      } else {
        buffer.add(element);
      }
    }

    // 处理列表末尾非null的剩余元素
    if (buffer.isNotEmpty) {
      result.add(mergeFunction(buffer));
    }

    return result;
  }
}

使用示例

针对你给出的[null, 3, 5, null]示例,调用时传入将数字列表拼接成整数的合并函数:

void main() {
  final originalList = [null, 3, 5, null];
  final mergedList = originalList.mergeBetweenNulls((list) {
    return int.parse(list.map((e) => e.toString()).join());
  });
  print(mergedList); // 输出: [null, 35, null]
}

适配其他场景

如果你的元素是字符串,比如[null, "a", "b", null],可以这样合并:

final strList = [null, "a", "b", null];
final mergedStrList = strList.mergeBetweenNulls((list) => list.join());
print(mergedStrList); // 输出: [null, "ab", null]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:40:28