Jako przykład, załóżmy, że mam przeliczalne collection
z par {first, second}
. Grupowanie tych par użyciuJak jednocześnie mapować i group_by?
Enum.group_by(collection, fn {first, second} -> first end)
spowoduje Map
którego klucze są określone przez przekazany funkcji anonimowej. Jego wartości to kolekcje par. Chciałbym jednak, aby jego wartości zawierały elementy tej pary: second
.
Na ogół podawany jest przeliczalny, chciałbym grupa zapewniając zarówno kluczowy wyciąg i do wartości mapowania, tak, że mogę określić, co zostanie wprowadzone do uzyskanych wartości Map
„s. To znaczy, chciałbym coś takiego
map_group_by(
collection,
fn {_first, second} -> second end,
fn {first, _second} -> first end
)
gdzie collection
„s Wartości są odwzorowane przed zgrupowane, jeszcze gdzie klucz odwzorowujący nadal pracuje na oryginalnych elementów.
Czy istnieje taka funkcja w bibliotece standardowej? Jeśli nie, jaki jest najbardziej idiomatyczny sposób, aby to osiągnąć?
Wiem, że mógłbym zrobić coś takiego
Enum.reduce(
collection,
%{},
fn({key, value}, acc) -> Dict.update(acc, key, [value], &([value | &1])) end
)
ale to wydaje się niezgrabne i tworzy [value]
list zapobiegawczo (jest to rzeczywiście prawda?). Czy istnieje lepszy sposób, który jest jednocześnie zwięzły i skuteczny?
Dla wyjaśnienia nie można użyć wartości 'Map.values', ponieważ nie działa ona na liście krotek, a nie na prawdziwej" Mapie ". – JustGage
Dziękuję za odpowiedź, ale to nie było to, czego szukałem: jak zauważyłeś, robi to drugie przejście, ale co ważniejsze, tworzy także kolekcję pośrednią. Jest zatem niepotrzebnie nieefektywna. – user4235730
@ user4235730, dodałem wersję, która powinna pasować do twoich upodobań. Zauważ, że jednak maszyna wirtualna Erlang nigdy nie modyfikuje pamięci w miejscu, a zatem tworzy kolekcje pośrednie bez względu na wszystko, chociaż nie jest to taki problem z niezmiennymi wartościami, ponieważ może w pewnym stopniu odnosić się do niezmienionych części starej wersji (jeśli działa w ogóle jak Clojure). – JustGage