2013-02-04 60 views
-1

我有一個對象數組,類型爲Lab,existing_labs,以及一個不同的Labs數組,new_labs。我已經爲Lab定義了我自己的==比較器。我將如何返回array1中不在array2中的元素?

existing_labs是db中已經存在的實驗室。 new_labs是實驗室根據它們在db中的存在而被保存的。

現在我做這個

new_labs.each do |l| 
    lab = Lab.new(l) 
    exists = existing_labs.map{ |existing_lab| lab == existing_lab } 
    lab.save unless exists.include? true 
end 

這工作,但可能會很慢,如果陣列中的一個或兩個大。我相信必須有更好的方式來做到這一點!

編輯爲清楚:

我的問題是:是否有返回所有存在於new_labs不存在於existing_labs的實驗室,用我的==方法的好辦法?

+0

這裏你有答案。 http://stackoverflow.com/questions/4592918/performing-an-outer-join-on-two-ruby-arrays – JAiro

+0

關閉,但我需要在兩個數組中的元素之間使用'=='方法進行比較我寫了(它在實驗室模型中)。 – igreulich

回答

1
new_labs.each do |l| 
    lab = Lab.new(l) 
    lab.save unless existing_labs.any?{|existing_lab| lab == existing_lab } 
end 

應該稍微快一些,因爲沒有爲每個實驗室創建一系列trues和falses。另外,當發現一個true時,any?退出。

0

使其中的set出現並應用difference方法。

+0

這似乎像'ary1 - ary2'一樣工作,它返回一個等於操作符左側集合的集合。 – igreulich

0

你可以簡單地使用-方法:

> ary1 = [1, 2, 3, 4, 5] 
> ary2 = [2,3] 
> ary1 - ary2 
=> [1, 4, 5] 

還有一句:

ary1.select { |e| not ary2.include? e } 

任何這些方法暗示的背景迭代,但我認爲-法勝的表現,也許幾個基準將是很好的。

+0

不幸的是,這似乎並沒有使用我的'=='方法,因此'ary1-ary2'總是返回一個等於'ary1'的數組,而'ary2-ary1'總是返回一個等於'ary2'的數組。 您包含的onliner似乎總是返回兩個數組中的相同元素。 – igreulich

1

你的問題並不清楚,但這裏是你的代碼的重構(refactorization):

(new_labs.map{|l| Lab.new(l)} - existing_labs).each(&:save) 
+0

爲了清晰起見,我編輯了我的問題。 – igreulich

0

返回數組1不在數組2的elments

> ary1 = [1, 2, 3, 4, 5] 
> ary2 = [2,7,9,3] 
> ary1 - ary2 
=> [1, 4, 5] 

返回陣列2中不屬於陣列1的元素

> ary1 = [1, 2, 3, 4, 5] 
> ary2 = [2,7,9,3] 
> ary2 - ary1 
=> [7,9] 
+0

不幸的是,這似乎並沒有使用我的'=='方法,因此'ary1-ary2'總是返回一個等於'ary1'的數組,而'ary2-ary1'總是返回一個等於'ary2'的數組。 – igreulich

相關問題