2017-01-25 9 views
0

このループをforeachやmapなどの関数やScalaで単純化するにはどうすればよいですか?私はそのフィルターshipList.filterの中にhitsArrayを入れたい。あなたはどこでもそれを使用しないようごshipSize = shipList.lengthを呼び出している理由スカラループを1行に簡略化

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

'ヴァルhitsArray:配列[文字列] = T.split( ""); for(ヒット< - hitsArray){shipSize = shipList.length; shipList = shipList.filter(!_。EqualsIgnoreCase(hit))}; if(shipList.length == 0){shipSunk = shipSunk + 1} else if(shipList.length

答えて

2

公平を期すために、私は理解していません。

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

あなたが行きたい場所に移動します。私はそれが副作用を介して働いていることを強調したいので、それを3行にしました。foreach。それは、私はそれを1ライナーにすることに利点がないと言いました。あなたが以前に持っていたものは完全に読みやすいものでした。

+0

ありがとうございます。私はshipSizeがなぜ必要なのかを示すために編集しました。私はあなたの事例でやり遂げることができます。 –

2

これはおそらく何か?

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

クリーナーが、shipListはすでに、すべて小文字である場合:

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

またはあなたのTは、ループの外に移動し、大きい場合:

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

最後の例で 'shipList.map(_。toLowerCase)... 'を実行する必要があると思います。 – pedrofurla