【发布时间】:2017-06-06 12:24:33
【问题描述】:
我想减去两个二维数组,可选择将注意力放在“唯一 id”列上。
还想用更详细的描述方式来表达我在寻找什么。
但是,例如,给定两个数组:
big = [['foo','bar@','baz'],
['cat','moew@','purr'],
['dog','bark@','woof'],
['mew', 'two@', 'blue']]
little = [['foo','bar@','baz'],
['dog','moew@','woof'],
['dog','bark@','woof']]
然后我们可以减去它们:
big - little #=> [["cat", "moew@", "purr"], ["mew", "two@", "blue"]]
这很有效,因为['cat','moew@','purr'] != ['dog','moew@','woof']。但是,我希望这两个被认为是相等的,因为它们在“唯一 id”列中具有相同的值。
我就是这样解决的:
big = [['foo','bar@','baz'],
['cat','moew@','purr'],
['dog','bark@','woof'],
['mew', 'two@', 'blue']]
little = [['foo','bar@','baz'],
['dog','moew@','woof'],
['dog','bark@','woof']]
def subtract big, little, key_index=nil
return big - little unless key_index
little_keys = little.map { |row| row[key_index] }.flatten
big.inject([]) do |result, row|
result << row unless little_keys.grep(row[key_index]).any?
result
end
end
subtract(big,little) #=> [["cat", "moew@", "purr"], ["mew", "two@", "blue"]]
subtract(big, little, 1) #=> [["mew", "two@", "blue"]]
很想知道更多关于如何描述我正在尝试做的事情以及是否有更好的方法。
另外,我的方式是O(n^2),因为它要遍历整个数组两次吗?一次用于#inject,一次用于#grep?
【问题讨论】:
标签: arrays ruby algorithm enumerable