Chunking-Liste basierend auf dem Strukturtyp, der sich ändert

8

Ich habe eine Liste, die ich basierend auf einem Übergang von Strukturtyp B zu A aufteilen möchte. So habe ich zum Beispiel folgendes:

%Vor%

Ich möchte, dass diese Daten in eine Liste mit zwei Elementen aufgeteilt werden, die Folgendes enthält:

%Vor%

Wenn die Eingabe anfänglich alle A oder alle B wäre, wäre die Ausgabe unverändert, da kein B- & gt; A-Übergang stattgefunden hat.

Ich stelle mir vor Enum.chunk_by/2 ist der Weg zu gehen, aber ich habe Probleme herauszufinden, wie der Kontext des vorherigen Elements zu wissen, wann zu spalten.

Wie sieht eine idiomatische Lösung für so etwas aus?

    
Nick Veys 16.05.2015, 21:29
quelle

3 Antworten

4

Eine andere Alternative besteht darin, chunk_by vom struct-Typ zu machen und dann einen weiteren Durchlauf durchzuführen, um die Listen zusammenzuführen (außer wenn die Liste %B{} enthält):

%Vor%     
José Valim 17.05.2015, 08:08
quelle
5

Noch ein anderer Ansatz besteht darin, reine Rekursion zu verwenden:

%Vor%     
sasajuric 17.05.2015 09:19
quelle
4

Enum.chunk_by/2 bietet derzeit keinen Zugriff auf das vorherige Element, daher können wir in diesem Fall Enum.chunk_by/2 nicht verwenden. Wir werden auf reduce/3

zurückgreifen müssen

Von allen Enum -Funktionen ist reduce/3 am flexibelsten und wird intern von den meisten, wenn nicht allen, der Enum -Funktionen verwendet.

Unten ist eine Möglichkeit, die gewünschte Ausgabe mit den Werten [ %A{}, %A{}, %B{}, %B{}, %B{}, %A{}, %A{}, %B{} ] :

zu erzeugen %Vor%

Beachten Sie, dass ich ein Element immer einer Liste voranstelle. Dies liegt daran, dass das Hinzufügen zu einer Liste in Elixir eine teure Operation ist.

Ich hoffe, diese Lösung hilft!

    
Gjaldon 17.05.2015 07:40
quelle

Tags und Links