1

我有两个数组:

array1 = [3, 4, 4, 5, 6, 7, 8, 8]
array2 = [4, 5, 8, 8]

我想删除 中的那些元素array1array2但仅在一个实例中。结果数组 ,array3必须是这样的:

array3 = [3, 4, 6, 7]

我试过:

array3 = array1 - array2

但结果并不理想:

array3 -> [3, 6, 7]
4

2 回答 2

1

这可能不是做你想做的最有效的方法,但它有效:

array1 = [3, 4, 4, 5, 6, 7, 8, 8]
array2 = [4, 5, 8, 8]
array2.each do |item|
    index = array1.index item
    array1.delete_at index if index
end
于 2013-02-14T14:07:07.047 回答
0

一个非命令式只是为了展示其他的做事方式。使用 Facets(只是为了方便获取直方图),我会写这个。在):

require 'facets'

array3 = array1.reduce([array2.frequency, []]) do |(h, output), x|
  if h[x] && h[x] > 0
    [h.update(x => h[x] - 1), output]
  else
    [h, output << x] 
  end
end[1]
#=> [3, 4, 6, 7]

要使代码片段纯粹是功能性的,您可以使用 Hash#merge/Array#+ 而不是 Hash#update/Array:<<,但由于这些数据结构的性质,它的效率会非常低。

于 2013-02-14T14:04:54.670 回答