Scala-Methode, um jedes Element eines Iterablen mit jedem Element eines anderen zu kombinieren?

8

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.

    
Geo 10.05.2011, 20:04
quelle

5 Antworten

24

Ich bin mir einer "Methode" nicht sicher, aber das kann nur mit einer verschachtelten / zusammengesetzten for ausgedrückt werden:

%Vor%

Glückliche Kodierung.

    
user166390 10.05.2011, 20:11
quelle
5

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.

update:

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.

update 2, Der Iterator:

%Vor%     
user unknown 11.05.2011 03:45
quelle
5

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.

Edit: basiert auf der Version des unbekannten Benutzers

Beachten Sie, dass die folgende Version nicht optimal ist (leistungsmäßig):

  • Indizierter Zugriff auf Listen (stattdessen Arrays verwenden)
  • takeWhile wertet nach jedem Element
  • aus

.

%Vor%     
ziggystar 10.05.2011 21:09
quelle
4

Wenn Sie Ihr tiefes Wissen über höher verwandte Typen und Kategorientheorie zeigen möchten, können Sie schreiben:

%Vor%

Abgesehen davon würde ich die Lösung von pst bevorzugen ...

    
Landei 11.05.2011 06:53
quelle
0

Hier ist noch eine, die das gleiche wie @ ziggystars letzte Änderung tut, aber keinen indizierten Zugriff auf Listen verwendet.

%Vor%

Und die zuckerhaltige Version:

%Vor%     
Tabo 13.02.2015 17:48
quelle