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的。
在斯卡拉,我不認爲groupBy解決方案將工作,因爲地圖的值將是數組,並將使用引用相等進行比較。 'l1.groupBy(identity).mapValues(_。length)== ...'可以工作。 – csjacobs24 2016-10-03 15:35:06
http://stackoverflow.com/questions/2944617/use-example-of-scala-observableset-trait – 2010-09-01 23:46:59
鏈接的問題與這個問題有什麼關係? – ssanj 2010-09-01 23:58:59
集合可以解決他的問題,但他對以下答案的評論表明他希望重複也被支持,所以集合現在不起作用。 – 2010-09-02 00:13:16