我有一个数组,希望能够移除其中所有重复的值。以下是需要翻译的内容:
arr = [1, 1, 2, 3, 4, 4, 5]
期望的输出结果为:
=> [2, 3, 5]
您认为最好的方法是什么?
arr = [1, 1, 2, 3, 4, 4, 5]
期望的输出结果为:
=> [2, 3, 5]
您认为最好的方法是什么?
p arr.group_by(&:itself).reject{|k,v|v.count>1}.keys
输出
[2, 3, 5]
这里有三种方法可以实现(@Rajagopalan的答案是其中之一)。
arr = [1, 1, 2, 3, 4, 4, 5]
arr.each_with_object(Hash.new(0)) { |n,h| h[n] += 1 }.select { |_,v| v == 1 }.keys
# => [2, 3, 5]
arr.uniq.select { |n| arr.count(n) == 1 }
#=> [2, 3, 5]
arr.uniq
元素都需要遍历 arr
。但是,如果 arr.uniq
不太大,实际上比使用计数哈希表或(如 Rajagopalan 所做的)Enumerable#group_by 更快。Array#difference
是我建议添加到 Ruby 核心的方法。class Array
def difference(other)
h = other.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
reject { |e| h[e] > 0 && h[e] -= 1 }
end
end
arr - arr.difference(arr.uniq)
#=> [2, 3, 5]
arr.each_with_object({}) { |e, h| h[e] = !h[e] & 0}.select{|_,v| v }.keys
- Ingoarr = [1,1,1]
,则返回 [1]
(因为对于给定的 e
,h[e] = !h[e] & 0
在 0
和 false
之间交替)。 - Cary Swovelandarr = [1, 1, 2, 3, 4, 4, 5]
arr.reject{|x| arr.count(x)>1}
=> [2, 3, 5]
multi_array = [[33], [34], [35], [34, 35], [34, 35], [36], [30, 31], [30, 31], [30, 31, 32], [32, 33]]
multi_flatten = multi_array.flatten
#=> [33, 34, 35, 34, 35, 34, 35, 36, 30, 31, 30, 31, 30, 31, 32, 32, 33]
multi_flatten.reject{|x| multi_flatten.count(x)>1}
#=> [36]
有一个更简单的解决方案:
arr = [1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
new_arr = arr - [1]
new_arr 返回 [2, 3, 4, 5, 6]