Wenn ich das habe:
%Vor% Ich würde gerne wissen, ob es eine solche Methode gibt, die es mir erlaubt, die erste Sammlung zu durchqueren und für jedes Element die gesamte zweite Sammlung zu durchlaufen. Nehmen wir zum Beispiel das Array a
, hätten wir a,x
, a,y
, b,x
, b,y
, c,x
, c,y
. Ich kenne Zip, aber von dem, was ich gesehen habe, funktioniert es nur auf Sammlungen der gleichen Größe, und es verbindet Elemente von den gleichen Positionen.
Ich bin mir einer "Methode" nicht sicher, aber das kann nur mit einer verschachtelten / zusammengesetzten for
ausgedrückt werden:
Glückliche Kodierung.
Für eine Liste mit einer unbekannten Anzahl von Listen unterschiedlicher Länge und für verschiedene Typen können Sie Folgendes verwenden:
%Vor%Sie würden es
nennen %Vor%kann aber auch mit Listen anderer Art aufgerufen werden:
%Vor%Arrays müssen in Listen konvertiert und das Ergebnis zurück in Arrays konvertiert werden, wenn Sie keine Listen verwenden können.
Auf dem Weg zu einer faulen Sammlung, habe ich ein funktionelles Mapping von einem Index (von 0 bis zur Kombinationsgröße - 1) zum Ergebnis an dieser Position gemacht, leicht berechnet mit Modulo und Division, nur ein bisschen Konzentration ist nötig:
%Vor%Es ist kein Problem, stattdessen einen Long oder BigInt zu verwenden.
Ich verwende Folgendes ausführlich in meinem Code. Beachten Sie, dass dies für eine beliebige Anzahl von Listen funktioniert. Es erstellt einen Iterator anstelle einer Sammlung, so dass Sie das potenziell große Ergebnis nicht im Speicher ablegen müssen.
Jede Verbesserung ist sehr willkommen.
%Vor% Wenn Sie diesen verwenden, müssen Sie new CombinationIterator(List(a,b))
schreiben, um einen Iterator zu erhalten, der jede Kombination durchläuft.
Beachten Sie, dass die folgende Version nicht optimal ist (leistungsmäßig):
.
%Vor%Tags und Links scala scala-collections cartesian-product