2011-04-01 42 views
19

我在比較郵政編碼。如何比較兩個數組的內容?

我有一個郵政編碼三個常量:

ZIP_MORRIS 
ZIP_UNION 
ZIP_ESSEX 

我想看看如果用戶在對象的數組,包含在其中的一個所有的拉鍊。

我嘗試這樣做:

ZIP_UNION.sort{|x,y| y <=> x} <=> Email.find(3).distributions.map(&:zip_code).uniq.compact.sort{|x,y| y <=> x} 

但不幸的是,這只是映射所有的郵政編碼,所以如果我選擇在不同的縣一個額外的拉鍊,那就不能正確進行比較。

我認爲最好的解決辦法是比較生成拉鍊用戶的價值,看看是否所有拉鍊的一個ZIP_COUNTY存在數組裏面。

某種類型的迭代器可以運行所有的zip文件,並確保用戶的zip文件包含或不包含zip組中的每個zip文件。

任何想法?

回答

67

你可以做陣列不同,如果結果是空數組,2個陣列包含相同的元素:

>> [1,2,3]-[3,1,2] #=> [] 

如果仍保留元素,則不是第一陣列中的所有元素的存在第二個:

>> [1,2,5]-[3,1,2] #=> [5] 
+4

簡單帶上蛋糕。 – Trip 2011-04-01 13:51:29

+1

@Trip:非常簡單。在我們的應用程序中,我經常需要做一些非常類似於ID數組達到幾十萬個元素的東西。所有其他方法證明太慢。 – 2011-04-01 13:53:34

+13

此解決方案適用於@ Trip問題中的特定示例,但不適用於一般情況。您需要執行兩次差異操作: #其中元素數量不匹配 [1] - [1,2]#=> [] [1,2] - [1]#=> [2] #哪裏有元素[1,1,2] - [2,2,1]#=> [] [2,2,1] - [1,1,2]# => [] – bobics 2012-09-25 17:56:59

8

下面我使用全部?運營商的陣列中,如果陣列中所有的物品爲我傳遞的塊返回true,這將返回true上。

my_zip = [1,2,3,4,5,6] 
[2,3,5].all?{|z| my_zip.include?(z)} 
=> true 
[20,3,5].all?{|z| my_zip.include?(z)} 
=> false 

你只改變它爲用戶的郵政編碼

+0

差不多..我確實已經選擇了他們,所以它應該**呈現真實。但事實並非如此。我假設,因爲它也包含其他不需要在'my_zip'中的拉鍊,並且不會考慮。 – Trip 2011-04-01 13:46:53

+1

根據2個陣列的長度,這可能非常慢。 – 2011-04-01 13:47:55

5
> [1,2,3] <=> [1,2,3] 
=> 0 
> [1,2,3] <=> [2,2,3] 
=> -1 
> [1,2,3] <=> [3,2,3] 
=> -1 
> [1,2,3] <=> [1,3,3] 
=> -1 
> [1,2,3] <=> [1,1,3] 
=> 1 

這是來自RailsThinker Post,並已爲我工作得非常好。

+0

謝謝!,偉大的運營商,特別是當你想比較語義版本! – MhdSyrwan 2016-01-05 13:02:45