我试图用Scala查找两个字符串的交集。我对Scala很新,但我觉得这应该是一个单行。我尝试过使用map和foldLeft,但还没有得到正确答案。
给定两个字符串,返回按顺序相同的字符列表。例如," abcd"," acc"应该返回" a"和" abcd"," abc"应该返回" abc"。
以下是我迄今为止尝试过的两项功能
(str1 zip str2).map{ case(a, b) => if (a == b) a else ""}
和
(str1 zip str2).foldLeft(""){case(acc,n) => if (n._1 == n._2) acc+n._1.toString else ""}
我想做的是这样的事情
(str1 zip str2).map{ case(a, b) => if (a == b) a else break}
但这不起作用。
我知道我可以用多行和一个for循环来做到这一点,但这感觉就像一个单行。有人可以帮忙吗?
由于
答案 0 :(得分:2)
(str1 zip str2).takeWhile( pair => pair._1 == pair._2).map( _._1).mkString
在scala REPL中测试它:
scala> val str1 = "abcd"
str1: String = abcd
scala> val str2 = "abc"
str2: String = abc
scala> (str1 zip str2).takeWhile( pair => pair._1 == pair._2).map( _._1).mkString
res26: String = abc
已编辑以传递两个测试用例
scala> (str1 zip "acc").takeWhile( pair => pair._1 == pair._2).map( _._1).mkString
res27: String = a
答案 1 :(得分:1)
这根本没有效率,但很明显:
def lcp(str1:String, str2:String) =
(str1.inits.toSet intersect str2.inits.toSet).maxBy(_.length)
lcp("abce", "abcd") //> res0: String = abc
lcp("abcd", "bcd") //> res1: String = ""
(取字符串1的所有前缀与字符串2的所有前缀的交集中最长的一个)
答案 2 :(得分:0)
或者,为了避免压缩整个字符串:
(s1, s2).zipped.takeWhile(Function.tupled(_ == _)).unzip._1.mkString
答案 3 :(得分:0)
这是:
scala> val (s1, s2) = ("abcd", "bcd")
s1: String = abcd
s2: String = bcd
scala> Iterator.iterate(s1)(_.init).find(s2.startsWith).get
res1: String = ""
scala> val (s1, s2) = ("abcd", "abc")
s1: String = abcd
s2: String = abc
scala> Iterator.iterate(s1)(_.init).find(s2.startsWith).get
res2: String = abc