arr = ["A", "X", "X", "D", "C", "B", "A"}
arr.detect{|e| arr.count(e) > 1}
duplicating_value_index_int_array = arr.index(<all duplicating values>)
您好我想从ruby数组中获取所有重复元素的索引。我怎么能实现这个目标?
答案 0 :(得分:1)
这是非常简单的实现。我认为它可能会有很大改善。
arr = ["A", "X", "X", "D", "C", "B", "A"]
groups = arr.each.with_index.group_by{|s, idx| s}.to_a # => [["A", [["A", 0], ["A", 6]]], ["X", [["X", 1], ["X", 2]]], ["D", [["D", 3]]], ["C", [["C", 4]]], ["B", [["B", 5]]]]
repeating_groups = groups.select{|key, group| group.length > 1} # => [["A", [["A", 0], ["A", 6]]], ["X", [["X", 1], ["X", 2]]]]
locations = repeating_groups.each_with_object({}) {|(key, group), memo| memo[key] = group.map{|g| g[1]}} # => {"A"=>[0, 6], "X"=>[1, 2]}
答案 1 :(得分:1)
duplicates = arr.each_with_index.group_by(&:first).inject({}) do |result, (val, group)|
next result if group.length == 1
result.merge val => group.map {|pair| pair[1]}
end
这将返回一个散列,其中键将是重复元素,值将是包含每个匹配项的索引的数组。 对于您的测试输入,结果是:
{"A"=>[0, 6], "X"=>[1, 2]}
如果你所关心的只是索引,你可以duplicates.values.flatten
来获得只有索引的数组。
在这种情况下:[0, 6, 1, 2]
答案 2 :(得分:0)
我将假设一个有效的Ruby数组arr
,如下所示:
arr = ["A", "X", "X", "D", "C", "B", "A"]
在此arr
下,并进一步假设它不包含nil
:
arr.map.with_index{|e, i| i if arr.count(e) > 1}.compact
# => [0, 1, 2, 6]
答案 3 :(得分:0)
目前尚不清楚你想要什么,但是这段代码会找到一个不唯一的数组元素的索引。它远没有效率,但可能不需要。
arr = %W/ A X X D C B A /
dup_indices = arr.each_index.find_all { |i| arr.count(arr[i]) > 1 }
p dup_indices
<强>输出强>
[0, 1, 2, 6]