2016-10-28 5 views
0

私は多くの文字列を持つこのseq usersを持っています。私がしたいのは、単語の長さに基づいてseqをフィルタリングすることです。これは、filtered_users = users.filter(_.length == x) (x = wanted word length)商品の長さに基づいた手品のフィルタリング

と言ってもいいですが、フィルタリングされたリストにchar longとchar short wordsが追加されています。私は2文字より長くは/短いので、私は何を探していますが、ユーザーを通過し、長すぎることすべてをフィルタリングする方法であるだけでなく、配列に追加しなければならない場合があります手動で

filtered_users2 = users.filter(_.length == x+1) 
filtered_users3 = users.filter(_.length == x-1) 
filtered_users ++= (filtered_users1 ++ filtered_users2) 

を書き込むことによってそれを行っていますまたは短い名前。私は、ワード長xdifferenceが予め与えられているループ

var filter = Seq[String]() 
for (i <- max(0, x - difference) to (x + difference)) { 
filter ++= users.filter(_.length == i) 
} 

に使用してこれを作成しました。しかし、seqが長い場合は、あまりにも多くの時間にわたってgeをしたくありません。私が探しているのは、ユーザseqを1回だけ通過し、フィルタリングされたリストを返す実装です。

もちろん、

val filtered_users = users.filter(_.length == x || _.length == x - 1 || _.length == x + 1) 

は動作しませんでした。

答えて

1

匿名関数で_を複数回使用すると、複数の入力引数として扱われます(最初の_が最初の引数、2番目の引数が2番目の引数となります)。引数を複数回使用する場合は、名前を付ける必要があります。

val x = 3 
val difference = 1 

users.filter(u => u.length >= x - difference && u.length <= x + difference) 
関連する問題