我可以从数组中删除唯一值:
array_with_doubles = [[1, 2], [2, 3], [1, 2]]
使用uniq
:
array_with_doubles.uniq
# => [[1, 2], [2, 3]]
我想找到删除了哪些值。
答案 0 :(得分:0)
给出上面的数组
array_with_doubles = [[1,2], [2,3], [1,2]]
只需运行以下命令,即可使数组值出现多次
array_with_doubles.group_by{|x|x}.map_values(&:size).select {|k,v| v>1}.keys
# => [[1,2]]
答案 1 :(得分:0)
可以通过以下方式确定唯一元素:
arr = [1, 2, 3, 2, 1, 4, 1]
uniq = arr.each_with_object(Hash.new(0)) {|e,h| h[e] += 1}.select {|_,v| v == 1}.keys
#=> [3, 4]
要删除唯一元素:
arr.reject { |e| uniq.include?(e) }
#=> [1, 2, 2, 1, 1]
数组中对象的性质(数字,数组,哈希,实例等)与问题无关。
确定唯一元素的方式是使用Hash::new的形式,该形式采用一个参数(此处为零),如果散列h[k]
没有键{,则为h
返回的值。 {1}}。因此,表达式k
被Ruby扩展为
h[e] += 1
在评估之前,成为
h[e] = h[e] + 1
如果h[e] = 0 + 1
没有密钥h
。有时称为计数哈希。
答案 2 :(得分:0)
您可以尝试以下方法:
array_with_doubles.uniq.select { |x| array_with_doubles.count(x) > 1 }
答案 3 :(得分:0)
您可以像这样获取所有已删除的元素:
array_with_doubles = [[1, 2], [2, 3], [1, 2], [1, 2]]
require 'set'
array_with_doubles.each_with_object(Set.new).inject([]) { |a, (e, seen)|
a << e if seen === e
seen << e
a
}
# => [[1, 2], [1, 2]]
与大多数其他答案不同,如果某个元素将被uniq
删除两次,则此代码将显示该元素的两个副本。 uniq
保留第一个equal元素,而此代码拒绝第一个equal元素。
答案 4 :(得分:0)
我已经解决了以下问题,
arr.inject([[],[]]) { |m, a| m[0].include?(a) ? m[1] << a : m[0] << a; m }[1]
答案 5 :(得分:0)
另一种选择,一种衬垫:
array_with_doubles = [[1, 2], [2, 3], [1, 2], [1, 2], [3, 5], [3, 5]]
array_with_doubles.uniq.each_with_object(array_with_doubles) { |e, a| a.delete_at(a.rindex(e)) }
# => [[1, 2], [1, 2], [3, 5]]