比较Scala中的两个列表

时间:2016-04-29 16:29:50

标签: string list scala compare

我有一个List[(String, Int)]和一个List[String]

第一个包含字符串中单词的出现次数,例如:

“这是一个示例字符串,就像其他每个示例字符串一样”

列表List[(String, Int)]是:

List(("This", 1), ("is", 1), ("a", 1), ("sample", 2), ("string", 2), ...)

第二个列表包含多个字符串,假设它包含:

List("one", "two", "string", "is")

比较我想要获得以下内容的两个字符串:

Result = 3

因为第二个列表包含“string”和“is”,列表字符串包含两个“string”和一个“is”。所以2 + 1 = 3。

有没有人知道比较两个列表并获得此结果的方法?

3 个答案:

答案 0 :(得分:2)

我建议将出现次数列表转换为地图,然后在第二个列表上运行.map(..).sum

scala> val occurrences = List(("This", 1), ("is", 1), ("a", 1), ("sample", 2), ("string", 2)).toMap
occurrences: scala.collection.immutable.Map[String,Int] = Map(is -> 1, This -> 1, a -> 1, string -> 2, sample -> 2)

scala> val input = List("one", "two", "string", "is")
input: List[String] = List(one, two, string, is)

scala> val answer = input.map(occurrences.getOrElse(_, 0)).sum
answer: Int = 3

答案 1 :(得分:2)

您可以使用foldLeft:

val l1: List[(String, Int)] = ???
val l2: List[String] = ???

l1.foldLeft(0)((acc, p) => if(l2.contains(p._1)) acc+p._2 else acc)

如果您需要对其进行优化,可以先将l2转换为Set,然后包含的内容应大部分为O(1)而不是线性。

答案 2 :(得分:0)

尝试以下操作: 即使您动态更改输入字符串,即使通过自行计算输入字符串中每个单词的计数,它也可以正常工作。 em>

list1.distinct.map(x=>(x,list1.count(_==x))).filter(x=>list2.contains(x._1)).unzip._2.sum

,或者如果您想直接使用输入字符串's,使用此

s.split(" +").distinct.map(x=>(x,list1.count(_==x))).filter(x=>list2.contains(x._1)).unzip._2.sum

val s = "This is a sample string like every other sample string"
scala> val list1= s.split(" +")
list1: Array[String] = Array(This, is, a, sample, string, like, every, other, sample, string)

list2 = val list2 = List("one", "two", "string", "is")

在SCALA REPL中:

scala> list1.distinct.map(x=>(x,list1.count(_==x))).filter(x=>list2.contains(x._1)).unzip._2.sum
res157: Int = 3

scala>