Dart 折叠列表
我可以用fold将列表展平Dart 折叠列表,dart,Dart,我可以用fold将列表展平 flattenWithFold(Iterable list) => list.fold([], (List xs, s) { s is Iterable ? xs.addAll(flattenWithFold(s)) : xs.add(s); return xs; }); 执行时 print(flattenWithFold([1,[3,5,[1,2]],[2,1],6])); 它产生正确的结果[1,3,5,1,2,2,1,6] 但当我试图重构以使用.
flattenWithFold(Iterable list) => list.fold([], (List xs, s) {
s is Iterable ? xs.addAll(flattenWithFold(s)) : xs.add(s);
return xs;
});
执行时
print(flattenWithFold([1,[3,5,[1,2]],[2,1],6]));
它产生正确的结果[1,3,5,1,2,2,1,6]
但当我试图重构以使用..add时,它会产生错误的结果
flattenWithFold1(Iterable list) => list.fold([], (List xs, s) => xs..add(
s is Iterable ? xs.addAll(flattenWithFold1(s)) : s));
有人能解释一下为什么执行时会出现null[1,3,5,1,2,null,null,2,1,null,6]吗
print(flattenWithFold1([1,[3,5,[1,2]],[2,1],6]));
您在结果中得到的是
null
,因为如果s
是Iterable
您正在执行xs..add(xs.addAll(flattWithFold1(s))
addAll
是一个void
方法,但由于您将其用作表达式,它返回null
。因此您将展平元素添加到xs
,但随后您添加了null
,这是void
方法的返回值。感谢@Harry的解释。是否有有效的方法使用折叠而不使用返回的展平方法?提前谢谢。你只需要级联addAll。我不确定为什么折叠是一个要求,因为你也可以进行展平(Iterable list)=>list。展开((item)=>item is Iterable?展平(item):[item]);使用expand是一种有效的方法。我只是想看看是否有其他有效的方法可以使用fold。感谢@AlanI找到了一种方法FlattWithFold(Iterable list)=>list。fold([],(list xs,s)=>s是Iterable?(xs..addAll(FlattWithFold(s)):(xs..add(s)))
构建中间列表并在之后使用它们进行添加并不是特别有效。备选方法:\u rec(累加器,元素)=>元素是可编辑的?元素。折叠(累加器,元素):(累加器..添加(元素));平面(可编辑元素)=>\u rec([],元素);