如何在Ruby中检测数组中的重复值?
假设我有一个看起来像这样的数组:
a = [cat, dog, cat, mouse, rat, dog, cat]
我如何循环,并做重复的事情 – 例如说删除它们?
换句话说,如果我做了a.each do |i|
,我如何评价[0],反对[1],[2],[3] …然后当我找到我想要的那个时,说[2]在这种情况下有第一个重复然后我把它推到一个堆栈或删除它或什么的。
我知道如何评估键,而不是值……但是如何在同一个数组中相互评估值?
谢谢。
您可以创建一个哈希来存储任何元素重复的次数。 因此只需迭代数组一次。
h = Hash.new(0) ['a','b','b','c'].each{ |e| h[e] += 1 }
应该结果
{"a"=>1, "b"=>2, "c"=>1}
这很有效,而且非常简单:
require 'set' visited = Set.new array.each do |element| if visited.include?(element) # duplicated item else # first appearance visited << element end end
试试这个:
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
将返回具有重复项的元素
试试这个:
array.inject({}){| h,e | h [e] = h [e] .to_i + 1; H}
使用a.uniq!
删除重复项。
还可以访问ruby-doc.org ,在那里你可以找到有关ruby类方法的更多信息。
一个简单的解决方案是运行双循环:
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
。
这将打印数组中的所有重复项:
array.inject(Hash.new(0)) { |hash,val| hash[val] += 1; hash }.each_pair { |val,count| puts "#{val} -> #{count}" if count > 1 }
如果您只是想摆脱重复,最简单的方法是获取数组并执行数组和数组。 使用&运算符。
如果你想知道那些重复是什么,只需将数组与数组和数组进行比较。
如果数组是可排序的,那么下面的内容将仅返回重复项。
array.sort.each_cons(2).select {|p| p[0] == p[1] }.map &:first
对数组进行排序,然后将其映射到连续的元素对,选择相同的对,映射到元素。
最好的方法是将其与自身的独特版本进行比较。 如果它相同则没有重复项,如果没有,则存在重复项。
unique_array = original_array.uniq
获得arrays的唯一版本
if original_array == unique_array then return true else return false
将它与原始数组进行比较。
简单!