2017-01-25 8 views
0

Wie vereinfache ich diese Schleife zu einer Funktion wie foreach oder Karte oder andere Sache mit Scala? Ich möchte hitsArray innerhalb dieses Filters shipList.filter setzen.Simplify Scala Schleife zu einer Zeile

val hitsArray: Array[String] = T.split(" "); 
for (hit <- hitsArray) { 
    shipSize = shipList.length 
    shipList = shipList.filter(!_.equalsIgnoreCase(hit)) 
} 
if (shipList.length == 0) { 
    shipSunk = shipSunk + 1 
} else if (shipList.length < shipSize) { 
    shipHit = shipHit + 1 
} 
+0

'val hitsArray: Array [String ] = T.split (""); for (hit <- hitsArray) {shipSize = shipList.length; shipList = shipList.filter (! _. equalsIgnoreCase (hit))}; if (shipList.length == 0) {shipSunk = shipSunk + 1} sonst if (shipList.length

Antwort

2

Um fair zu sein, ich verstehe nicht, warum Sie shipSize = shipList.length fordern, wie Sie es nicht überall verwenden.

T.split(" ").foreach{ hit => 
    shipList = shipList.filter(!_.equalsIgnoreCase(hit)) 
} 

was bringt Sie dahin, wo Sie hin wollen. Ich habe es 3 Zeilen gemacht, weil Sie betonen möchten, dass Sie über Nebenwirkung in diesem foreach arbeiten. Das heißt, ich sehe keinen Vorteil darin, es zu einem Einzeiler zu machen. Was Sie vorher hatten, war perfekt lesbar.

+0

danke. Ich habe bearbeitet, um zu zeigen, warum ich shipSize brauche. Ich könnte mit deinem Beispiel machen. –

2

So etwas vielleicht?

shipList.filter(ship => T.split(" ").forall(!_.equalsIgnoreCase(ship))) 

Obwohl sauberer, wenn shipList ist schon alles in Kleinbuchstaben:

shipList.filterNot(T.split(" ").map(_.toLowerCase) contains _) 

Oder wenn Ihr T ist groß, es außerhalb der Schleife bewegen:

val hits = T.split(" ").map(_.toLowerCase) 
shipList.filterNot(hits contains _) 
+0

Ich denke, Sie müssen 'shipList.map (_. ToLowerCase) ...' auch in Ihrem letzten Beispiel tun. – pedrofurla