【问题标题】:Compare ArrayBuffer[Array[String]] with Scala in FP way以 FP 方式将 ArrayBuffer[Array[String]] 与 Scala 进行比较
【发布时间】:2019-03-19 14:24:40
【问题描述】:

我需要使用纯函数式编程比较两个ArrayBuffer[Array[String]] 类型的集合。

例如

ArrayBuffer(Array("str1"), Array("str2"), Array("str3"))
// compare with
ArrayBuffer(Array("str1"), Array("str2"), Array("str3"))

我有ArrayBuffer[String]的解决方案:

  def sameAs[A](c: Traversable[A], d: Traversable[A]): Boolean =
    if (c.isEmpty) d.isEmpty
    else {
      val (e, f) = d span (c.head !=)
      if (f.isEmpty) false else sameAs(c.tail, e ++ f.tail)
    }

【问题讨论】:

  • 用 ==(或 !=)比较数组没有多大意义,因为 Array("a") == Array("a") 是 false

标签: scala functional-programming arraybuffer


【解决方案1】:

如果我们要检查类型 A 中的两个可遍历值是否相同,我们必须在数据类型 A 中具有排序或函数来检查类型 A 中的两个值是否相同。

解决方案:首先,有一些方法来检查两个数组是否相同(通过编写排序或函数),然后编写一个函数来检查 Array[T] 的两个可遍历对象是否相同。

下面的函数检查两个数组是否相同:

def isTheSameArray[T](xs: Array[T], ys: Array[T])(implicit ordering: Ordering[T]): Boolean = 
  xs.size == ys.size && xs.zip(ys).forall{ case (x, y) => x == y } 

现在我们可以编写函数来检查两个数组缓冲区是否相同,如下所示:

def isTheSame[T](xs: Traversable[Array[T]], ys: Traversable[Array[T]])(implicit ordering: Ordering[T]): Boolean = 
  if (xs.size != ys.size) false 
  else if (xs.isEmpty == ys.isEmpty) true
  else isTheSameArray(xs.head, ys.head) && isTheSame(xs.tail, ys.tail) 

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2015-12-29
    相关资源
    最近更新 更多