Felipe
Felipe

Reputation: 7563

Simplify Scala loop to one line

How do I simplify this loop to some function like foreach or map or other thing with Scala? I want to put hitsArray inside that filter shipList.filter.

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
}

Upvotes: 0

Views: 1150

Answers (2)

Alvaro Carrasco
Alvaro Carrasco

Reputation: 6172

Something like this maybe?

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

Although cleaner if shipList is already all lower case:

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

Or if your T is large, move it outside the loop:

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

Upvotes: 2

wheaties
wheaties

Reputation: 35970

To be fair, I don't understand why you are calling shipSize = shipList.length as you don't use it anywhere.

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

which gets you to where you want to go. I've made it 3 lines because you want to emphasize you're working via side effect in that foreach. That said, I don't see any advantage to making it a one-liner. What you had before was perfectly readable.

Upvotes: 2

Related Questions