array=["dog","cat","monkey","cat","bear"]
我试过了:
array.uniq
["dog", "cat", "monkey", "bear"]
我也试过
array.inject{|memo,word| word==memo}
但这也不起作用。我很难过。
我确信有更优雅的解决方案: 找到dupes,然后删除数组中dupes数组中的单词
dupes=array.group_by {|e| e}.map { |e| e[0] if e[1][1]}.compact
array.delete_if{|word| dupes.include?(word)}
答案 0 :(得分:2)
我假设您希望删除多次出现的所有数组元素。
array - array.each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }.
select { |_,v| v > 1 }.
keys
#=> ["dog", "monkey", "bear"]
步骤如下。
g = array.each_with_object(Hash.new(0)) { |s,h| h[s] += 1 }
#=> {"dog"=>1, "cat"=>2, "monkey"=>1, "bear"=>1}
h = g.select { |_,v| v > 1 }
#=> {"cat"=>2}
a = h.keys
#=> ["cat"]
array - a
#=> ["dog", "monkey", "bear"]
答案 1 :(得分:1)
试试这个:
array=["dog","cat","monkey","cat","bear"]
puts array.reject { |e| array.count(e)>1 }
# dog
# monkey
# bear
它在O(n²)
中运行,所以不要将它用于你的DNA研究,但是对于少量元素它应该没问题。
为了加快速度,请使用准备好的哈希表:
array=["dog","cat","monkey","cat","bear"]
count = {}
array.each { |e| count[e] = (count[e]||0) + 1 }
puts array.reject { |e| count[e]>1 }
# dog
# monkey
# bear
我不知道Hash
使用什么类型的实现,因此无法提供真正的复杂性,但我希望它介于O(n)
和O(n*logn)
之间。< / p>
轻微变化只是为了好玩:
array=["dog","cat","monkey","cat","bear"]
count = {}
array.each { |e| count[e] = (count[e]||0) + 1 }
count.delete_if { |key, value| value>1 }
puts count.keys
# dog
# monkey
# bear
答案 2 :(得分:0)
您可以使用delete_if
删除与字符串匹配的项目:
array=["dog","cat","monkey","cat","bear"]
array.delete_if{|item| item == 'dog'}
=> ["cat", "monkey", "cat", "bear"]
您还可以使用更简单的delete
:
array.delete('cat')
=> ["monkey", "bear"]
请参阅http://ruby-doc.org/core-2.4.0/Array.html#method-i-delete_if