Scala:比较数组忽略顺序
Scala: Compare Arrays ignoring order
我想知道 Arrays 中是否有任何方法可以忽略顺序检查是否相等。到目前为止,我确实找到了这个:
test("test ignoring order"){
assert(Array(1,2,4,5).sameElements(Array(1,4,2,5)))
}
但是因为顺序不一样所以失败了:
org.scalatest.exceptions.TestFailedException: scala.Predef.intArrayOps(scala.Array.apply(1, 2, 4, 5)).sameElements[Int](scala.Predef.wrapIntArray(scala.Array.apply(1, 4, 2, 5))) was false
在数组的内部或外部有什么方法可以做到这一点吗?
编辑:我不需要对数组进行排序,我只想比较它们而忽略顺序。
以下将对两个数组进行排序,然后使它们相等:
test("test ignoring order"){
assert(Array(1,2,4,5).sorted sameElements Array(1,4,2,5).sorted)
}
注意:
- 如果您正在使用
Array
以外的一些其他集合,则可以使用 ==
而不是 sameElements
。
array1.toSet == array2.toSet
如果其中一个数组有重复项而另一个没有重复项,则将不起作用。
这是否按预期工作?
import scala.annotation.tailrec
def equalsIgnoringOrder(first:Array[Int], second:Array[Int]) : Boolean = {
def removeAtIndex(i:Int, array: Array[Int]) : Array[Int] = {
val buffer = array.toBuffer
buffer.remove(i)
buffer.toArray
}
@tailrec
def firstEqualSecondRec(i:Int, other:Array[Int]) : Boolean = {
if(other.isEmpty) true
else {
val el = first(i)
val index = other.indexOf(el)
if(index == -1) false
else firstEqualSecondRec(i+1, removeAtIndex(index, other))
}
}
if (first.length != second.length) false
else {
val startingIndex = 0
firstEqualSecondRec(startingIndex, second)
}
}
一个简单的递归就可以做到。
def isSame[T](arrA:Array[T], arrB:Array[T]) :Boolean =
arrA.length == arrB.length &&
(arrA.isEmpty || isSame(arrA.filterNot(_ == arrA.head)
,arrB.filterNot(_ == arrA.head)))
但是@Tim 的问题是有效的:您对明显且简单的排序解决方案有何异议?
我想知道 Arrays 中是否有任何方法可以忽略顺序检查是否相等。到目前为止,我确实找到了这个:
test("test ignoring order"){
assert(Array(1,2,4,5).sameElements(Array(1,4,2,5)))
}
但是因为顺序不一样所以失败了:
org.scalatest.exceptions.TestFailedException: scala.Predef.intArrayOps(scala.Array.apply(1, 2, 4, 5)).sameElements[Int](scala.Predef.wrapIntArray(scala.Array.apply(1, 4, 2, 5))) was false
在数组的内部或外部有什么方法可以做到这一点吗?
编辑:我不需要对数组进行排序,我只想比较它们而忽略顺序。
以下将对两个数组进行排序,然后使它们相等:
test("test ignoring order"){
assert(Array(1,2,4,5).sorted sameElements Array(1,4,2,5).sorted)
}
注意:
- 如果您正在使用
Array
以外的一些其他集合,则可以使用==
而不是sameElements
。 array1.toSet == array2.toSet
如果其中一个数组有重复项而另一个没有重复项,则将不起作用。
这是否按预期工作?
import scala.annotation.tailrec
def equalsIgnoringOrder(first:Array[Int], second:Array[Int]) : Boolean = {
def removeAtIndex(i:Int, array: Array[Int]) : Array[Int] = {
val buffer = array.toBuffer
buffer.remove(i)
buffer.toArray
}
@tailrec
def firstEqualSecondRec(i:Int, other:Array[Int]) : Boolean = {
if(other.isEmpty) true
else {
val el = first(i)
val index = other.indexOf(el)
if(index == -1) false
else firstEqualSecondRec(i+1, removeAtIndex(index, other))
}
}
if (first.length != second.length) false
else {
val startingIndex = 0
firstEqualSecondRec(startingIndex, second)
}
}
一个简单的递归就可以做到。
def isSame[T](arrA:Array[T], arrB:Array[T]) :Boolean =
arrA.length == arrB.length &&
(arrA.isEmpty || isSame(arrA.filterNot(_ == arrA.head)
,arrB.filterNot(_ == arrA.head)))
但是@Tim 的问题是有效的:您对明显且简单的排序解决方案有何异议?