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)
}

注意:

  1. 如果您正在使用 Array 以外的一些其他集合,则可以使用 == 而不是 sameElements
  2. 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 的问题是有效的:您对明显且简单的排序解决方案有何异议?