2016-04-01 10 views
4

Ich habe eine Liste von Tupeln, für die ich die Werte in einer Map ändern muss, die diese Tupel enthält. Also, wenn ich eine Liste wie List((0,2), (0,3)) mit einer Karte habe, die so aussieht: Map((0,2) => List(1,2,3), (0,3) => List(1,2)), muss ich auf die passenden Map-Tupel mit den in der Liste aufgeführten Tupeln zugreifen und dann eine Nummer aus dem Mapping entfernen.Iterieren über eine bestehende Karte gegen eine Liste von Tupeln. Scala

Also im obigen Beispiel, wenn ich 2 aus dem Mapping entfernen wollte, würde ich Map((0,2) => List(1,3), (0,3) => List(1)) bekommen.

Design weise, ich dachte an Muster passend zur Karte, aber ich habe einige Antworten gelesen, die gesagt haben, dass das nicht der beste Weg sein kann. Der schwierige Teil für mich ist, dass es unveränderlich sein muss, also dachte ich über ein Muster nach, das mit der Liste übereinstimmt, den Map-Wert erhält, den Wert ändert, dann die Map neu erstellt und die Funktion rekursiv aufruft. Was halten Sie von dieser Implementierung?

def filterInMap(element: Int, oldMap: Map[(Int,Int),List[Int]]) = 
    oldMap.mapValues(list => list.filter(_ != element)) 

Auf diese Weise gibt es keine Notwendigkeit, zu mutieren, irgendetwas überhaupt:

val newMap = oldMap.mapValues(list => list.filter(_ != 2)) 

Oder allgemeiner:

Antwort

2

Dies könnte ein Weg zu entfernen 2 von Ihrem Map sein. mapValues wandelt nur die Werte Ihrer Map um und gibt eine Kopie des Originals zurück, ohne es zu mutieren. filter erledigt dann die Aufgabe, indem nur Elemente zugelassen werden, die nicht mit dem Element übereinstimmen, das wir entfernen möchten.

Bonus: noch allgemeiner:

def filterInMap[A](element: A, oldMap: Map[(A,A),List[A]]) = 
    oldMap.mapValues(list => list.filter(_ != element)) 
+1

Ich habe Test, und es funktioniert, ich Ihre Lösung gefällt. –

Verwandte Themen