2016-09-19 174 views
5

我有兩個函數返回相同大小的結果列表,我試圖檢查結果是否相同。列表中的訂單可能不同。我目前使用以下功能:檢查兩個列表是否包含相同的元素

lists_are_the_same(List1, List2) -> 
    List1 -- List2 =:= []. 

該函數從另一個列表中減去一個列表並檢查結果是否爲空列表。問題是,這種方法非常慢,在我的情況下,列表可能相當大。

有沒有更快的方法來檢查兩個列表是否包含完全相同的元素?

回答

6

一個更快的方式進行排序每個列表,然後對它們進行比較如下:基於對Steve評論

lists_are_the_same(List1, List2) -> 
    lists:sort(List1) =:= lists:sort(List2). 

,要知道Erlang的所有值都進行排序,並且有defined order是很重要的,所以它適用於所有可能的列表元素。

+7

在Erlang中所有的值都是排序,因爲類型有一個[定義的總順序](http://erlang.org/doc/reference_manual/expressions.html#id81064)。 –

+0

@SteveVinoski這是對的,我在答案中提到了你的內容豐富的評論。謝謝。 –

2

如果您的所有元素都是唯一您可能需要使用ordsets而不是lists。您也可以documentation查看關於使用A -- B操作:

的的lists:subtract(A, B)複雜性是成正比 length(A)*length(B),這意味着它是非常緩慢的,如果兩個AB是 長列表。 (如果兩個清單很長,它是一個更好的選擇使用 有序列表和ordsets:subtract/2

然後你就可以檢查它們是否通過平等:

ordsets:is_subset(List1,List2) andalso ordsets:is_subset(List2,List1) 
+1

+1 。這似乎比排序快得多,然後在我的微型基準中比較相等但整齊的整數列表。 – Dogbert

相關問題