如何合并Dart列表中两个null值间元素并替换原列表对应位置
解决方案
你当前的groupByNull方法仅提取了两个null之间的元素组,但丢失了原列表中null的位置信息,所以没办法直接对应回原列表完成替换。要实现需求,更高效的方式是在遍历列表时直接处理合并逻辑,同时保留null的位置,以下是具体实现:
实现思路
- 维护一个临时缓冲区存储两个
null之间的非null元素,以及一个结果列表用于生成最终输出。 - 遍历原列表的每个元素:
- 遇到
null时:如果缓冲区里有元素,先按规则合并这些元素,将合并结果加入结果列表;再把null加入结果列表,最后清空缓冲区。 - 遇到非
null元素时:直接加入缓冲区。
- 遇到
- 遍历结束后,如果缓冲区还有剩余元素(比如列表末尾不是
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
相关产品推荐
相关产品推荐

