Ruby 从数组中提取非唯一值

Ruby 从数组中提取非唯一值,ruby,Ruby,我可以从数组中删除唯一值: array_with_doubles = [[1, 2], [2, 3], [1, 2]] 使用uniq: array_with_doubles.uniq # => [[1, 2], [2, 3]] 我想找出哪些值被删除。给定上述数组 array_with_doubles = [[1,2], [2,3], [1,2]] 只需运行以下命令,即可多次显示数组值 array_with_doubles.group_by{|x|x}.map_values(&

我可以从数组中删除唯一值:

array_with_doubles = [[1, 2], [2, 3], [1, 2]]
使用
uniq

array_with_doubles.uniq
# => [[1, 2], [2, 3]]
我想找出哪些值被删除。

给定上述数组

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]]

可按以下方式确定唯一元素:

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]
数组中对象的性质(数字、数组、哈希、实例等)与问题无关

确定唯一元素时使用的形式为,它接受一个参数(此处为零),如果哈希
h
没有键
k
,则该参数是
h[k]
返回的值。因此,表达式
h[e]+=1
,Ruby扩展为

h[e] = h[e] + 1
在对其进行评估之前,它将成为

h[e] = 0 + 1
如果
h
没有键
k
。这有时被称为计数哈希。

您可以尝试以下方法:

 array_with_doubles.uniq.select { |x| array_with_doubles.count(x) > 1 }

您可以按如下方式获取所有已删除的元素:

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]]
array_与_double=[[1,2],[2,3],[1,2],[1,2]]
需要“设置”
数组_与_加倍。每个_与_对象(Set.new)。注入([]){| a,(e,seen)|

a我已经解决了上面的问题,如下所示

arr.inject([[],[]]) { |m, a| m[0].include?(a) ? m[1] << a : m[0] << a; m }[1]

arr.inject([[],[]){| m,a | m[0]。包括?(a)m[1]另一个选项,一个线性:

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]]

提示:
.group\u by(&:本身)
您可以通过询问数组中的哪些元素是唯一的来简化措辞,除非您希望答案也显示如何从数组中删除唯一的元素(在这种情况下,您应该明确该要求)。标题和第一句似乎有冲突。我认为您希望识别唯一值并删除它们,尽管后一个操作似乎不是问题的一部分。与使用
group\u by
或计数哈希(即
O(n))相比,这具有时间复杂性
O(n**2)
的缺点
。这是因为
计数
O(n)
,必须对数组中的每个元素进行计数。您可以通过在
之前插入
.uniq
来加快计数速度。选择
。在我注意到复制了解决方案后更新。