2017-11-21 9 views
1

私は、文字列の順番に読み込み、文字列の共通幹を返すことができるようにしたいです。たとえば、次のシーケンスがある場合:どのように再帰的に一連の文字列の一般的なルートを見つけるには?

val testSeq: Seq[String] = Seq("RootA_", "RootB_", "RootC_") 

文字列 "Root"のみが返されます。

私の現在の機能は次のようになりますが、交差を使用すると、「_」不要の根の部分、すなわち「Root_」として返されることを意味します。私はtakeWhileを使ってみましたが失敗しました。このためにScalaの方法で構築されたあなたは私に知らせてください可能性がある場合

def findRoot(ss: Seq[String], root: String): String = ss match { 
    case h :: Nil => h.intersect(root) 
    case h :: t => findRoot(t, h.intersect(t.head)) 
} 

!そうでなければ、誰かがこの問題を解決するために亀裂を持つことを望むなら、それは非常に高く評価されるだろう!

答えて

0

私の知る限りでは、二つの文字列の共通のプレフィックスを返す何もScalaのSTDLIB機能はありません。

あなたはziptakeWhile

def findRoot(seq: Seq[String]): String = {        

    def prefix(a: String, b: String) = a       
     .zip(b)       
     .takeWhile { case (a, b) => a == b } 
     .map(_._1) 
     .mkString             

    @tailrec              
    def find(ss: Seq[String], root: String): String = ss match { 
     case h :: Nil => prefix(h, root)       
     case h :: t => find(t, prefix(h, root))     
    }                

    find(seq.tail, seq.head)          

}                 
を使用して共通のプレフィックスを計算することができます
関連する問題