这不是问题,但更多的问题是否有其他方法可以做到这一点:
我有一个数组:
arr = [1,2,3,4,4,5,1,4,3]
我想要这个输出:[2,5]
我的代码如下所示:
arr.select { |e| arr.count(e) == 1}
还有其他替代方案吗?
答案 0 :(得分:8)
试试这个
arr.group_by { |e| e }.select { |k, v| v.size.eql? 1 }.keys
=> [2, 5]
答案 1 :(得分:4)
您的代码将为每个元素扫描一次数组,这对于小型数组是可接受的,但它不是必需的。通过查看this blog post,很容易想出
arr = [1,2,3,4,4,5,1,4,3]
counts=Hash.new(0)
arr.each do |el|
counts[el]+=1
end
counts.select do |key, count|
count == 1
end.keys
会产生相同的结果,但只会遍历您的数组一次(但会牺牲两个额外的哈希值(如果您不需要select!
,可以使用counts
减少到一个: - )。
答案 2 :(得分:3)
首先需要查看整个数组以确定唯一性
def one(a)
o = { }
a.each do |x|
v = o[x]
if v == nil
o[x] = true
else
if v
o[x] = false
end
end
end
return o
end
然后使用它来选择唯一元素
def unique(a)
o = one(a)
b = [ ]
o.each do |k, v|
if v
b.push(k)
end
end
return b
end
测试代码
a = [ 1, 2, 3, 4, 4, 5, 1, 4, 3 ]
b = unique(a)
puts "unique: #{a} -> #{b}"
输出
unique: [1, 2, 3, 4, 4, 5, 1, 4, 3] -> [2, 5]
致力于Edsger W. Dijkstra
一个现代的,有能力的程序员不应该有困惑,他不应该陶醉于诡计,他应该谦虚并避免像瘟疫一样聪明的解决方案
(来自EWD303)