我有一个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。
有没有人知道比较两个列表并获得此结果的方法?
答案 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> list1.distinct.map(x=>(x,list1.count(_==x))).filter(x=>list2.contains(x._1)).unzip._2.sum
res157: Int = 3
scala>