2012-01-20 21 views
-2

例子我有此數組:Rails如何從某些組合中刪除obj?

@packages = ["2", ["4", "2", "1"], "4", ["4","2"], ["5", "6"]] 

24可能無法由

那裏["4", "2", "1"]["4,"2"]應該從陣列中移除

應該怎樣做呢?

所以輸出將是:@packages = ["2", "4", ["5", "6"]]

2和4僅是一個例子。而且數字的數量也有所不同。

+1

這並不完全清楚你想問什麼......你的輸入的一般形式和你的預期輸出是什麼? –

+0

數組中的數字2和4可能不在一起,並且應該刪除這些數字的任意組合。我寫了輸出。 –

+0

什麼是混合? – tokland

回答

2

如果要刪除陣列,具有共同的至少2個元素給出的事:

@packages = ["2", ["4", "2", "1"], "4", ["4","2"], ["3", "2"]] 
@opposites = ["2", "4"] 

@packages.reject! { |p| p.is_a?(Array) && (@opposites & p).size >= 2 } 

@packages => ["2", "4", ["3", "2"]]

+0

唯一的問題是,如果@opposites是[「2」,「4」,「9」],它只會刪除100%的匹配而不是[「2」,「 4「]你可以在這裏看到它http://pastie.org/3220682 –

+0

如果不是'100%匹配',我仍然沒有得到你想達到的目標。 – tomgi

+0

示例可能不在一起的數字是[「2」,「4」,「9」]。然後應該刪除任何具有這些組合的數組:[「2」,「4」]和[「2」,「9」]和[「2」,「4」,「9」]。想想它是否像一個有關係的船。數組中的數組可能只有數字2,4和9中的一個。 –

1

正如已經評論的那樣,你的問題並不完全清楚。如果你只是想刪除主數組的數組元素,那麼你可以做。

@packages.reject{|element| element.is_a?(Array)} 
+0

我不想刪除數組中的所有數組。只有那些有2和4組合的數組 –

2

最簡單的方法後,看是否數組有兩個"2""4"是使用Array#&(即設置十字路口):

@packages.reject { |a| a.is_a?(Array) && (a & [ '2', '4' ]).length == 2 } 

例如:

>> @packages = ["2", ["4", "2", "1"], "4", ["4","2"], ["5", "6"], ["1", "2"], ["4", "11"], ["2", "2", "4"]] 
=> ["2", ["4", "2", "1"], "4", ["4", "2"], ["5", "6"], ["1", "2"], ["4", "11"], ["2", "2", "4"]] 
>> @packages.reject { |a| a.is_a?(Array) && (a & [ '2', '4' ]).length == 2 } 
=> ["2", "4", ["5", "6"], ["1", "2"], ["4", "11"]] 

如果您在一個單獨的陣列拒絕列表那麼上面的概括很容易:

rejects = %w(2 4) 
@packages.reject { |a| a.is_a?(Array) && (a & rejects).length == rejects.length } 

你只需要確保rejects沒有任何重複,但你總是可以添加一個uniq,如果你不確定rejects是否有重複。