【问题标题】:finding the count of times element of one list is greater than the element of another list in scala在scala中查找一个列表的元素大于另一个列表的元素的次数
【发布时间】:2019-03-25 07:08:52
【问题描述】:

我在 scala 中有 2 个列表作为输入。我想比较列表和输出中的相应元素,将分数作为两个元素的列表。显示一个列表的比较元素大于其他元素的时间总和的元素。

input:
List(1, 2, 3, 4, 7, 9)
List(0, 1, 2, 1, 1, 4)

output:
List(6,0)

因为第一个列表的元素是第二个列表的元素的六倍。

Input :
List(17, 28, 30)
List(99, 16, 8)

output:
List(2,1)

我是 scala 的新手,我知道这可以通过应用 for 循环直到列表长度并增加计数器来轻松完成。但我正在寻找 scala 中的单行解决方案以利用其函数式编程范例

【问题讨论】:

  • 假设两个列表的长度相同,并且两个列表的第一个元素将被比较列表的第二个元素将被比较。如果两个元素相等,则不会计算这种情况

标签: scala


【解决方案1】:

我正在寻找单线解决方案

这取决于你如何计算行数。这可以用一行来表达,但这样更容易阅读。

listA.zip(listB).foldLeft(List(0,0)){ case (List(gt,lt),(a,b)) =>
  if      (a>b) List(gt+1, lt)
  else if (a<b) List(gt, lt+1)
  else          List(gt, lt)
}

【讨论】:

    【解决方案2】:

    计算一个值大于另一个值的次数是单线:

    a.zip(b).count{ case (a, b) => a > b }
    

    如果你想得到你所说的形式,它需要另一个语句,但你可以把它放在同一行:)

    {val c = a.zip(b).count{ case (a, b) => a > b }; (c, a.length - c)}
    

    如果您的结果确实需要一条语句,则需要像其他解决方案一样使用foldLeft,但它可能需要多行!

    【讨论】:

      【解决方案3】:

      您可能希望使用递归函数来比较 fp 样式中的每个元素,该样式在点处递归计算总和。

      另一种方法(在 scala 中)是将它们压缩在一起并比较每一行元素。

      例子:

      def getScores(score1: List[Int], score2: List[Int]) = {
        val scoresComapred = score1.zip(score2).map {
          case (s1, s2) if s1 > s2 => (1, 0)
          case (s1, s2) if s1 == s2 => (0, 0)
          case (s1, s2) if s2 > s1 => (0, 1)
        }
      
        val (finalScore1, finalScore2) =
          scoresComapred.foldLeft((0, 0)) { (a, b) => (a._1 + b._1, a._2 + b._2) }
        List(finalScore1, finalScore2)
      }
      
      val score1 = List(1, 2, 3, 4, 7, 9, 10)
      val score2 = List(0, 1, 2, 1, 1, 4)
      println(getScores(score1, score2)) //List(6, 0)
      
      println(getScores(List(17, 28, 30), List(99, 16, 8))) //List(2, 1)
      

      注意:zip 最多只接受第一个集合中的元素。

        def zip[A1 >: A, B, That](that: GenIterable[B])(implicit bf: CanBuildFrom[Repr, (A1, B), That]): That = {
          val b = bf(repr)
          val these = this.iterator
          val those = that.iterator
          while (these.hasNext && those.hasNext)
            b += ((these.next(), those.next()))
          b.result()
        }
      

      相关:Scala - Two Lists to Tuple List

      【讨论】:

        猜你喜欢
        • 2022-01-06
        • 2011-08-17
        • 2018-07-15
        • 2021-08-24
        • 2020-07-07
        • 1970-01-01
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多