如何在字符串数组中查找重复元素并将结果存储在另一个数组中

时间:2015-01-29 15:12:39

标签: ruby

我有一个字符串数组:

Array1 = ["ab", "cd", "ab", "cd", "ef"]

我正在尝试查找Array1中的所有重复元素,并将它们存储在另一个数组Array2中。在这种情况下,"ab""cd"应存储在Array2

我试过了:

Array2 = Array1.detect{ |c| Array1.count(c) > 1 }

但它只返回第一个重复元素。

3 个答案:

答案 0 :(得分:2)

这是一种方式。

arr = ["ab", "cd", "ab", "cd", "ef"]

arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
   .select { |_,v| v > 1 }
   .keys
  #=> ["ab", "cd"]

我们首先使用Enumerable#each_with_object来计算:

g = arr.each_with_object(Hash.new(0)) { |e,h| h[e] += 1 }
  #=> {"ab"=>2, "cd"=>2, "ef"=>1} 

然后Hash#select(不是Enumerable#select)获取:

h = g.select { |_,v| v > 1 }
  #=> {"ab"=>2, "cd"=>2} 

最后,Hash#keysh中提取密钥:

h.keys
  #=> ["ab", "cd"] 

另一种方法是使用集合:

require 'set'

s = Set.new
arr.select { |e| !s.add?(e) }.uniq
  #=> ["ab", "cd"] 

Set#add?尝试将e的值添加到集合中。如果能够这样做,则返回self(评估true);如果它无法执行此操作(因为e的值已经在集合中,这意味着至少有两个arr元素的值为e) ,它返回nil。在后一种情况下,我们要选择arr的元素,因此我们编写!s.add?(e),评估true

答案 1 :(得分:1)

array2 = array1.select { |item| array1.count(item) > 1 }.uniq

答案 2 :(得分:1)

您可以使用#each_with_object方法:

array2 = array1.uniq
               .each_with_object([]) { |e, a| a << e if array1.count(e) }