如何获取ruby数组中重复元素的索引

时间:2013-07-12 12:27:04

标签: ruby arrays

 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数组中获取所有重复元素的索引。我怎么能实现这个目标?

4 个答案:

答案 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]