这不是问题,更像一个疑问,是否有其他方法可以做到这一点:
我有一个数组:
这个有没有其他替代方案?
arr = [1,2,3,4,4,5,1,4,3]
我希望得到这个输出:[2,5]
我的代码看起来像这样:
arr.select { |e| arr.count(e) == 1}
这个有没有其他替代方案?
试一试
arr.group_by { |e| e }.select { |k, v| v.size.eql? 1 }.keys
=> [2, 5]
keys
代替collect(&:first)
。 - Mark Thomas您的代码将针对每个元素扫描数组一次,这对于小型数组是可以接受的,但并不是必要的。通过查看这篇博客文章,很容易想出更好的方法。
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!
将其减少到一个哈希表 :-)。select!
;-) - Patruarr.each_with_object(Hash.new(0)) { |x,h| h[x] += 1 }.select { |k,v| v == 1 }.keys
是一个简洁的一行代码 :) - bjhaid首先需要全面了解整个数组,才能决定其唯一性。
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)