-4
 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>)

Hi I want to get all the duplicating element's indexes from a ruby array. How may I achieve this?

4

4 回答 4

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]

于 2013-07-12T12:38:32.927 回答
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]}
于 2013-07-12T12:34:45.527 回答
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]
于 2013-07-12T13:04:25.433 回答
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]
于 2013-07-12T12:39:02.047 回答