Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 是否有一种API方法可以不考虑顺序地比较序列的内容?_Scala_Equality - Fatal编程技术网

Scala 是否有一种API方法可以不考虑顺序地比较序列的内容?

Scala 是否有一种API方法可以不考虑顺序地比较序列的内容?,scala,equality,Scala,Equality,假设: val l1 = List(1,2,3) val l2 = List(2,3,1) 我想要一个方法来确认l1等于l2(内容相同但顺序不同)。List/Seq上是否有API方法来执行此操作 l1.sameElements(l2) 不工作,因为它也验证订单 我得出以下结论: l1.foldLeft(l1.size == l2.size)(_ && l2.contains(_)) 有什么比上面更简洁的方法来进行比较吗?如果您想要的是“这些列表包含相同的元素,而不考虑顺序

假设:

val l1 = List(1,2,3) 
val l2 = List(2,3,1)
我想要一个方法来确认l1等于l2(内容相同但顺序不同)。List/Seq上是否有API方法来执行此操作

l1.sameElements(l2)
不工作,因为它也验证订单

我得出以下结论:

l1.foldLeft(l1.size == l2.size)(_ && l2.contains(_))
有什么比上面更简洁的方法来进行比较吗?

如果您想要的是“这些列表包含相同的元素,而不考虑顺序或重复”:

l1.toSet==l2.toSet

如果您想要的是“这些列表包含相同的元素,并且每个元素的重复次数相同”:

l1.sorted==l2.sorted

如果您想要的是“这些列表包含相同的元素且大小相同,但两个列表之间给定元素的重复次数可能不同”:

l1.size==l2.size&&l1.toSet==l2.toSet

l1.sorted == l2.sorted
是正确的,由于排序的原因,它的运行时性能是O(n log n)。对于大型列表,您可能更喜欢使用

l1.groupBy(identity) == l2.groupBy(identity)

哪一个应该是O(n),假设groupBy实现得不错。

链接的问题与此问题有什么关系?集合可以解决他的问题,但他对下面答案的评论指出,他希望也支持重复项,因此集合现在不起作用。是的,在问题中,我检查列表的大小是否相等。因此,基本上,列表的大小必须相等,重复与否。我也要考虑重复的元素。所以列表(1,2,3,3)不应该等于(列表(3,2,1))列表(1,2,3,3)。排序!=我不知道你想要什么。您想确保完全相同的元素集在每个列表中出现的次数完全相同,而不考虑顺序,对吗?对不起,我的意思是:list(1,2,3,3)。sorted!=列表(3,2,1)。排序是的,只是相同数量的元素和相同的元素-可以是不同的顺序。听起来你想让列表大小相同,但你不在乎第一个列表是否有10'3,第二个列表是否有4'3,只要它们都至少有一个'3',并且生成的列表大小相等。。。。是吗?在Scala中,我认为groupBy解决方案不起作用,因为映射的值将是数组,这些值将使用引用等式进行比较
l1.groupBy(identity).mapValues(u.length)=……
也可以。