假设我有一个类似以下结构的数组:
a = [cat, dog, cat, mouse, rat, dog, cat]
我该如何循环处理数组并对重复项执行某些操作,比如删除它们?
换句话说,如果我使用了
a.each do |i|
,那么我该如何对 a[0]、a[1]、a[2]、a[3] 等进行比较,当找到需要的元素时(例如在本例中是 a[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}使用这段代码可以将数组转换为哈希表,并计算每个元素出现的次数。
array.inject(Hash.new(0)){|h, e| h[e] += 1; h}
将数组中的元素注入到一个哈希表中,并统计每个元素出现的次数。 - Aleksander Pohl使用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
。
最好的方法是将其与唯一版本进行比较。如果相同,则没有重复项,否则存在重复项。
unique_array = original_array.uniq
if original_array == unique_array then return true else return false
简单!
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
对数组进行排序,然后将其映射到连续的元素对,选择相同的对,再将其映射到元素。
如果您只想摆脱重复项,最简单的方法是取出数组并执行array&array。使用&运算符。
如果您想知道这些重复项是什么,请将数组与array&array进行比较。
h = Hash.new(0)
和h[e] += 1
呢? - Aleksander Pohlnil?
和增量方法。谢谢! - marcamillion