Als ein Beispiel, sagen wir, ich habe eine aufzählbare collection
von Paaren {first, second}
. Gruppierungs diese PaareWie mappe ich gleichzeitig und group_by?
Enum.group_by(collection, fn {first, second} -> first end)
Verwendung in einem Map
deren Schlüssel bestimmt werden durch die übergebene anonyme Funktion führen. Seine Werte sind Sammlungen von Paaren. Allerdings möchte ich, dass seine Werte stattdessen die second
Elemente des Paares enthalten.
Im Allgemeinen eine zählbare gegeben, würde Ich mag Gruppe sowohl einen Schlüssel-Extraktor und Wert Mapper bereitstellt, damit ich feststellen kann, was in die resultierenden Map
‚s Werte setzen wird. Das heißt, würde ich so etwas wie
map_group_by(
collection,
fn {_first, second} -> second end,
fn {first, _second} -> first end
)
wo collection
‚s Werte abgebildet werden, bevor sie gruppiert mögen, noch, wo der Schlüssel Mapper arbeitet immer noch auf den ursprünglichen Elementen.
Gibt es eine solche Funktion in der Standardbibliothek? Wenn nicht, was ist der idiomatische Weg, dies zu erreichen?
Ich weiß, dass ich etwas tun könnte, wie
Enum.reduce(
collection,
%{},
fn({key, value}, acc) -> Dict.update(acc, key, [value], &([value | &1])) end
)
aber dies scheint klobig und schafft [value]
Listen präventiv (ist das wirklich wahr?). Gibt es einen besseren Weg, der sowohl prägnant als auch effizient ist?
Nur zur Klarstellung, dies kann nicht 'Map.values' verwenden, da es nicht an einer Tupelliste arbeitet, sondern an einer echten" Map ". – JustGage
Vielen Dank für Ihre Antwort, aber das ist nicht, was ich gesucht habe: wie Sie bemerken, macht dies einen zweiten Durchgang, aber noch wichtiger, es schafft auch eine Zwischenkollektion. Es ist daher unnötig ineffizient. – user4235730
@ user4235730, ich habe eine Version hinzugefügt, die Ihrer Fantasie entsprechen sollte. Beachten Sie jedoch, dass die Erlang VM den Speicher niemals an Ort und Stelle verändert und somit Zwischensammlungen erstellt, obwohl dies bei unveränderlichen Werten kein Problem ist, da sie die unveränderten Teile der alten Version in gewissem Maße referenzieren kann (falls dies der Fall ist) funktioniert wie Clojure). – JustGage