2017-07-18 5 views
1

前にループを終了しますが、簡単なコード:最初のテストが失敗するまでのコードでより機能非機能以下にするためにどのようにエンド

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"パラメータを使う方が速いのですか?

+0

Idkについては慣用ですが、その早い復帰はおそらくそのような1行に詰め込まれるべきではありません。関数の下半分を実行せずに終了することができるように、中かっこで完全なif/elseツリーに展開します。 – Carcigenicate

答えて

1

それはできますか?

Seq(1,2,3).takeWhile(_ < 3) 

P.ありがとう、@ mrmcgreg、私は非常にcarufullyを読んでいない。最初のものを含めるには失敗しました:

val s = Seq(1,2,3).span(_ < 3) 
s._1 ++ s._2.take(1) 

P.S.そして、比較値を含めるには:

val s = Seq(1,2,3).map(e => (e, compare(e)).span(test(_._2)) 
s._1 ++ s._2.take(1) 
+0

OPにはテストに失敗した最初のものを含める必要があるので、正しく表示されません。 – mrmcgreg

+0

私は比較の戻り値を含める必要があります。この例ではブール値ですが、実際のコードではtrue/falseより多くの値を持つことができ、返されたseqには失敗した比較が含まれている必要があります。 – user4955663

+0

シーケンスを変換することができます: 'Seq(1,2,3).map(e =>(e、f(e))。span(_._ 2 <3)' ... –

関連する問題