2010-09-01 36 views
19

假設:是否有API方法比較Seq的內容而不管順序如何?

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

有什麼比上述更加簡潔這樣做比較呢?

+0

http://stackoverflow.com/questions/2944617/use-example-of-scala-observableset-trait – 2010-09-01 23:46:59

+0

鏈接的問題與這個問題有什麼關係? – ssanj 2010-09-01 23:58:59

+0

集合可以解決他的問題,但他對以下答案的評論表明他希望重複也被支持,所以集合現在不起作用。 – 2010-09-02 00:13:16

回答

27

如果你想要的是「這些列表包含相同的元素,不論順序或重複」:

l1.toSet == l2.toSet

如果你想要的是「這些列表包含相同的元素,並且具有相同每個的重複數「:

l1.sorted == l2.sorted

如果你想要的是」這些列表包含相同的元素和大小相同,但考慮的重複次數元素可以在兩個名單「之間的不同:

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

+0

我想迎合重複的元素。 所以列表(1,2,3,3)不應該等於(List(3,2,1)) – ssanj 2010-09-02 00:00:46

+0

好吧,編輯以反映:) – 2010-09-02 00:08:04

+0

List(1,2,3,3).sorted!=列表(3,2,1) – ssanj 2010-09-02 00:15:25

9

雖然

l1.sorted == l2.sorted 

是正確的,它的運行時性能是O(n log n)的,因爲排序。對於大名單,你是

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

這應該是爲O(n)可能是更好的,假設一個體面的執行GROUPBY的。

+0

在斯卡拉,我不認爲groupBy解決方案將工作,因爲地圖的值將是數組,並將使用引用相等進行比較。 'l1.groupBy(identity).mapValues(_。length)== ...'可以工作。 – csjacobs24 2016-10-03 15:35:06

相關問題