我正在使用Ruby 1.9.3,我想从一个出现多次的数组中删除值。我有以下内容:
arr = [1,2,2,3,4,5,6,6,7,8,9]
,结果应为:
arr = [1,3,4,5,7,8,9].
实现这一目标的最简单,最短的Ruby代码是什么?
答案 0 :(得分:2)
正如@Sergio Tulentsev所提到的,group_by和select的组合将起到作用 你去吧
arr.group_by{|i| i}.select{|k, v| v.count.eql?(1)}.keys
答案 1 :(得分:2)
我们可以通过数组webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url);
和select
方法
count
答案 2 :(得分:0)
def find_duplicates(elements)
encountered = {}
# Examine all elements in the array.
elements.each do |e|
# If the element is in the hash, it is a duplicate.
if encountered[e]
#Remove the element
else
# Record that the element was encountered.
encountered[e] = 1
end
end
end
答案 3 :(得分:0)
我想从多次出现的数组中删除值。
下面是一个例子:
> arr.delete_if{|e| arr.count(e) > 1}
#=> [1, 3, 4, 5, 7, 8, 9]
<强>选项2:强>
> arr.group_by{|e| e}.delete_if{|_,v| v.size > 1}.keys
#=> [1, 3, 4, 5, 7, 8, 9]
首先你需要自己对元素进行分组(它将返回键,值对),然后删除出现多次(值)的元素,并使用keys
答案 4 :(得分:0)
我倾向于使用计算哈希。
<强>代码强>
def single_instances(arr)
arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }.
select { |_,v| v == 1 }.
keys
end
示例强>
single_instances [1,2,2,3,4,5,6,6,7,8,9]
#=> [1, 3, 4, 5, 7, 8, 9]
<强>解释强>
步骤如下。
arr = [1,2,2,3,4,5,6,6,7,8,9]
f = Hash.new(0)
#=> {}
使用方法Hash::new创建 f
,参数为零。这意味着,如果f
没有密钥k
,则f[k]
将返回零(并且不会更改f
)。
enum = arr.each_with_object(f)
#=> #<Enumerator: [1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9]:each_with_object({})>
h = enum.each { |e,h| h[e] += 1 }
#=> {1=>1, 2=>2, 3=>1, 4=>1, 5=>1, 6=>2, 7=>1, 8=>1, 9=>1}
g = h.select { |_,v| v == 1 }
#=> {1=>1, 3=>1, 4=>1, 5=>1, 7=>1, 8=>1, 9=>1}
g.keys
#=> [1, 3, 4, 5, 7, 8, 9]
在计算g
时,Hash#select(返回哈希值),而不是Enumerable#select(返回数组),执行。我在第一个块变量(h
中的一个键)中使用了下划线来表示它未在块计算中使用。
让我们更仔细地看一下h
的计算。第一个值由枚举器enum
生成并传递给块,块变量使用名为消歧或分解的过程分配值。
e, h = enum.next
#=> [1, {}]
e #=> 1
h #=> {}
所以块计算是
h[e] += 1
#=> h[e] = h[e] + 1 => 0 + 1 => 1
在相等的右侧的 h[e]
(使用方法Hash#[],与相等左侧的Hash#[]=形成对比),返回1
因为{ {1}}没有密钥h
。
e #=> 1
的下两个元素将传递给块,并执行以下计算。
enum
请注意e, h = enum.next
#=> [2, {1=>1}]
h[e] += 1
#=> h[e] = h[2] + 1 => 0 + 1 => 1
已更新。
h
这一次,因为e, h = enum.next
#=> [2, {1=>1, 2=>1}]
h[e] += 1
#=> h[e] = h[e] + 1 => h[2] + 1 => 1 + 1 => 2
h #=> {1=>1, 2=>2}
已经有一个键h
,所以不使用哈希的默认值。
其余的计算方法类似。
使用e #=> 2
代替
更简单的方法是使用方法[Array#difference]
。
Array#difference
假设
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 = [1,2,2,3,4,2,5,6,6,7,8,9]
。
2
这三个步骤如下。
arr - arr.difference(arr.uniq)
# => [1, 3, 4, 5, 7, 8, 9]
我建议a = arr.uniq
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = arr.difference(a)
#=> [2, 2, 6] (elements that appear more than once)
arr - b
# => [1, 3, 4, 5, 7, 8, 9]
为added to the Ruby core,但似乎没有兴趣这样做。