返回Ruby中类似的数组元素

说我有这样一个数组:

arr = ['footballs_jumba_10', 'footballs_jumba_11', 'footballs_jumba_12', 'footballs_jumba_14', 'alpha_romeo_11', 'alpha_romeo_12', 'alpha_juliet_10', 'alpha_juliet_11'] 

如果我想返回重复项,(假设数组中的任何字符串都完全相同,我只会

 return arr.detect{ |a| arr.count(a) > 1 } 

但是,如果我只想获得数组中每个元素的前10个字符的副本,而不事先知道变化,该怎么办? 像这样:

 ['footballs_', 'alpha_rome', 'alpha_juli'] 

这个方法非常简单,我在答案中提出了Arry#difference

 arr << "Let's add a string that appears just once" #=> ["footballs_jumba_10", "footballs_jumba_11", "footballs_jumba_12", # "footballs_jumba_14", "alpha_romeo_11", "alpha_romeo_12", # "alpha_juliet_10", "alpha_juliet_11", "Let's add a string that appears just once"] a = arr.map { |s| s[0,10] } #=> ["footballs_", "footballs_", "footballs_", "footballs_", "alpha_rome", # "alpha_rome", "alpha_juli", "alpha_juli", "Let's add "] b = a.difference(a.uniq) #=> ["footballs_", "footballs_", "footballs_", "alpha_rome", "alpha_juli"] b.uniq #=> ["footballs_", "alpha_rome", "alpha_juli"] 

使用Array#uniq

 arr.map {|e| e[0..9]}.uniq # => ["footballs_", "alpha_rome", "alpha_juli"] 

你可以这样做:

 def partial_duplicates(elements) unique = {} duplicates = {} elements.each do |e| partial = e[0..9] # If the element is in the hash, it is a duplicate. if first_element = unique[partial] duplicates[first_element] = true duplicates[e] = true else # include the element as unique unique[partial] = e end end duplicates.keys end 

这将返回唯一的重复项。 如果你想要所有重复项,你可以使用一个Array

此外,这将返回每个副本的所有完整表示,因为它似乎更有用,可能是您想要的:

 partial_duplicates(arr) => ["footballs_jumba_10", "footballs_jumba_11", "footballs_jumba_12", "footballs_jumba_14", "alpha_romeo_11", "alpha_romeo_12", "alpha_juliet_10", "alpha_juliet_11"] 

如果只想要部分重复,可以将条件更改为:

 if unique[partial] duplicates[partial] = true else unique[partial] = true end 

然后:

 partial_duplicates(arr) => ["footballs_", "alpha_rome", "alpha_juli"]