前にループを終了しますが、簡単なコード:最初のテストが失敗するまでのコードでより機能非機能以下にするためにどのようにエンド
def foo2(iSeq: Seq[Int]): Seq[(Int, Boolean)] = {
var seq = Seq[(Int, Boolean)]()
iSeq.foreach{ i=>
println("i = " + i)
val res = (i,i>=0)
seq = seq ++ Seq(res)
if (res._2==false) return seq
}
seq
}
アイデアは無いためさらに実際のコードでは、ループ与えられた配列にありますテストには費用がかかります。返されたseqには、失敗したアイテムの前のすべてのアイテムが含まれている必要があります。次のようにコードの
出力は次のとおりです。
scala> foo2(Seq(1,2,-3,4))
i = 1
i = 2
i = -3
res3: Seq[(Int, Boolean)] = List((1,true), (2,true), (-3,false))
scala> foo2(Seq(1,2,3,4))
i = 1
i = 2
i = 3
i = 4
res4: Seq[(Int, Boolean)] = List((1,true), (2,true), (3,true), (4,true))
私は、次の最初の試みをした:
def fooo(iTail: Seq[Int], resSeq: Seq[(Int,Boolean)]): Seq[(Int,Boolean)] = {
if (iTail.isEmpty) return resSeq
if (!resSeq.isEmpty && resSeq.last._1<0) return resSeq
println("i = " + iTail.head)
val res = (iTail.head,iTail.head>=0)
val seq = resSeq ++ Seq(res)
fooo(iTail.tail, seq)
}
出力は次のとおりです。
scala> fooo(Seq(1,2,3,4,5),Seq())
i = 1
i = 2
i = 3
i = 4
i = 5
res0: Seq[(Int, Boolean)] = List((1,true), (2,true), (3,true), (4,true), (5,true))
scala> fooo(Seq(1,2,-3,4,5),Seq())
i = 1
i = 2
i = -3
res1: Seq[(Int, Boolean)] = List((1,true), (2,true), (-3,false))
だから、それは動作しますが、そこにありますこれをコード化するためのより簡潔な、あるいは「スケーラッシュな」方法?
パフォーマンスについて:コードはresSeq.lastを使用します。 resSeq.lastを使うよりも、再帰関数foooに追加の "lastValue"パラメータを使う方が速いのですか?
Idkについては慣用ですが、その早い復帰はおそらくそのような1行に詰め込まれるべきではありません。関数の下半分を実行せずに終了することができるように、中かっこで完全なif/elseツリーに展開します。 – Carcigenicate