删除数组中的匹配字符串

时间:2017-02-21 19:47:17

标签: ruby

 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)}

3 个答案:

答案 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