2017-01-24 4 views
1

konnte ich eine Liste glätten mit faltenFlatten Liste mit Fold

flattenWithFold(Iterable list) => list.fold([], (List xs, s) { 
s is Iterable ? xs.addAll(flattenWithFold(s)) : xs.add(s); 
    return xs; 
}); 

Wenn

Ausführung
print(flattenWithFold([1,[3,5,[1,2]],[2,1],6])); 

Es richtiges Ergebnis erzeugt [1, 3, 5, 1, 2, 2, 1 , 6]

Aber wenn ich versuche zu verwenden .add zu Refactoring, es zu falschem Ergebnis

flattenWithFold1(Iterable list) => list.fold([], (List xs, s) => xs..add(
       s is Iterable ? xs.addAll(flattenWithFold1(s)) : s)); 

Kann jemand bitte erklären, warum null [1, 3, 5, 1, 2, null, null, 2, 1, null, 6] beim Ausführen vorhanden sind?

print(flattenWithFold1([1,[3,5,[1,2]],[2,1],6])); 

Antwort

4

Sie erhalten null in Ihr Ergebnis, denn wenn s eine Iterable ist Sie xs..add(xs.addAll(flattenWithFold1(s)) tun. addAll ist eine void-Methode, aber da Sie sie als Ausdruck verwenden, gibt sie null zurück. Also fügen Sie die abgeflachten Elemente zu xs hinzu, aber dann fügen Sie null hinzu, was der Rückgabewert von void Methoden ist.

+0

Danke für die Erklärung @Harry. Gibt es einen effektiven Weg, um Falten ohne Rücksendung zu reduzieren? Danke im Voraus. –

+0

Sie müssen nur die addAll kaskadieren. Ich bin mir nicht sicher, warum fold ist eine Voraussetzung, weil Sie auch flatten könnten (Iterable Liste) => list.expand ((Element) => Element ist Iterable? Flatten (Element): [Element]); –

+0

Verwenden von Expand ist ein effizienter Weg. Ich habe gerade versucht zu sehen, ob es einen anderen effizienten Weg mit der Falte gibt. Danke @Alan –