如何在Ruby中检测数组中的重复值?

时间:2012-03-07 10:32:28

标签: ruby arrays

假设我有一个看起来像的数组:

a = [cat, dog, cat, mouse, rat, dog, cat]

如何循环使用,并使用重复项进行操作 - 例如说删除它们?

换句话说,如果我做a.each do |i|,我如何评估[0],[1],[2],[3] ......然后当我找到一个我想,在这种情况下说[2]有第一个副本,然后我把它推到堆栈或删除它或其他东西。

我知道如何评估密钥与值...但是如何在同一个数组中相互评估值?

感谢。

10 个答案:

答案 0 :(得分:11)

您可以创建一个哈希来存储任何元素重复的次数。因此只需迭代数组一次。

h = Hash.new(0)
['a','b','b','c'].each{ |e| h[e] += 1 }

应该结果

 {"a"=>1, "b"=>2, "c"=>1}

答案 1 :(得分:6)

这很有效,而且非常简单:

require 'set'

visited = Set.new
array.each do |element|
  if visited.include?(element)
    # duplicated item
  else
    # first appearance
    visited << element
  end
end

答案 2 :(得分:3)

试试这个:

class Array
    def find_dups
        uniq.map {|v| (self - [v]).size < (self.size - 1) ? v : nil}.compact
    end
end

a = ['cat', 'dog', 'cat', 'mouse', 'rat', 'dog', 'cat']

print a - a.find_dups # Removes duplicates

find_dups将返回具有重复项的元素

答案 3 :(得分:2)

试试这个:

array.inject({}){|h, e| h[e] = h[e].to_i + 1; h}

答案 4 :(得分:1)

一个简单的解决方案是运行双循环:

a.each_with_index do |a1, idx1|
  a.each_with_index do |a2, idx2|
    next if idx1 >= idx2 # Don't compare element to itself 
                         # and don't repeat comparisons already made

    # do something with a pair of elements (a1, a2)
  end
end

如果你只是想消除重复,有一种方法:Array#uniq

答案 5 :(得分:1)

使用 a.uniq!删除重复项。

还要查看ruby-doc.org,在那里你可以找到有关ruby类方法的更多信息。

答案 6 :(得分:0)

这将打印数组中的所有重复项:

array.inject(Hash.new(0)) { |hash,val| 
  hash[val] += 1; 
  hash 
}.each_pair { |val,count| 
  puts "#{val} -> #{count}" if count > 1 
}

答案 7 :(得分:0)

如果您只是想摆脱重复,最简单的方法是获取数组并执行数组和数组。使用&amp;运营商。

如果你想知道那些重复是什么,只需将数组与数组和数组进行比较。

答案 8 :(得分:0)

如果数组是可排序的,那么下面的内容将只返回重复项。

array.sort.each_cons(2).select {|p| p[0] == p[1] }.map &:first

对数组进行排序,然后将其映射到连续的元素对,选择相同的对,映射到元素。

答案 9 :(得分:0)

最好的方法是将其与自身的独特版本进行比较。如果它相同则没有重复,如果没有,则存在重复。

unique_array = original_array.uniq

获取阵列的唯一版本

if original_array == unique_array then return true else return false

将它与原始数组进行比较。

简单!