【问题标题】:Compare two lists in Scala比较 Scala 中的两个列表
【发布时间】:2016-08-24 21:51:53
【问题描述】:

我有一个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。

有谁知道比较两个列表并得到这个结果的方法吗?

【问题讨论】:

    标签: string list scala compare


    【解决方案1】:

    我建议将出现列表转换为 Map,然后在第二个列表上运行 .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
    

    【讨论】:

    • 效果很好。谢谢。
    【解决方案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,然后contains应该大部分是O(1)而不是linear。

    【讨论】:

      【解决方案3】:

      试试这个: 即使您动态更改输入字符串,即使通过计算输入字符串中每个单词的计数,它也能正常工作。 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 2013-03-03
        • 1970-01-01
        • 2018-03-19
        相关资源
        最近更新 更多