以 FP 方式比较 ArrayBuffer[Array[String]] 和 Scala
Compare ArrayBuffer[Array[String]] with Scala in FP way
我需要使用纯函数式编程比较两个 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)
}
如果我们想检查类型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)
我需要使用纯函数式编程比较两个 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)
}
如果我们想检查类型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)