我有一个字符串数组:
Array1 = ["ab", "cd", "ab", "cd", "ef"]
我正在尝试查找Array1
中的所有重复元素,并将它们存储在另一个数组Array2
中。在这种情况下,"ab"
和"cd"
应存储在Array2
。
我试过了:
Array2 = Array1.detect{ |c| Array1.count(c) > 1 }
但它只返回第一个重复元素。
答案 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#keys从h
中提取密钥:
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) }