Scala:比较数组时忽略顺序

m0rkklqb  于 2022-11-29  发布在  Scala
关注(0)|答案(4)|浏览(209)

我想知道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

有没有什么方法可以做到这一点,在 * 数组 * 内部或外部?
编辑:我不需要对数组进行排序,我只想忽略顺序进行比较。

xa9qqrwz

xa9qqrwz1#

一个简单的递归就可以做到。

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

但@蒂姆的问题是有效的:你对这个显而易见的简单分类的解决方案有什么异议?

o4tp2gmn

o4tp2gmn2#

下面将对两个数组进行排序,然后使它们相等:

test("test ignoring order"){
  assert(Array(1,2,4,5).sorted sameElements Array(1,4,2,5).sorted)
}

注:
1.如果您正在使用Array以外的其他集合,则可以使用==而不是sameElements
1.如果其中一个数组有重复项,而另一个没有,则array1.toSet == array2.toSet将不起作用。

vlju58qv

vlju58qv3#

这是否按预期工作?

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

2skhul334#

这是一个更老的线程,但我只是有同样的问题。
所提出的答案包括排序(只对可比较对象有效)或具有O(n^2)运行时行为(和/或非平凡递归)的方法。
另一种(简单但可理解且功能强大)方法是使用Scala的diff函数:

def hasSameElementsUnordered[T](arrA: Array[T], arrB: Array[T]): Boolean = {
    (arrA.length == arrB.length) && (arrA diff arrB).isEmpty
}

顺便说一句,这适用于任何集合和元素类型,而不仅仅是数组和可比较对象。diff()在内部构建了一个出现计数散列Map,因此运行时行为对于更大的集合会更好。

相关问题