假设我有一个看起来像的数组:
a = [cat, dog, cat, mouse, rat, dog, cat]
如何循环使用,并使用重复项进行操作 - 例如说删除它们?
换句话说,如果我做a.each do |i|
,我如何评估[0],[1],[2],[3] ......然后当我找到一个我想,在这种情况下说[2]有第一个副本,然后我把它推到堆栈或删除它或其他东西。
我知道如何评估密钥与值...但是如何在同一个数组中相互评估值?
感谢。
答案 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
将它与原始数组进行比较。
简单!