Другие ответы не учитывают возможность записи в списке несколько раз в массиве.Это вернет хеш, где каждый ключ является уникальным объектом в массиве, а каждое значение является массивом индексов, который соответствует месту, в котором находится объект:
a = [1, 2, 3, 1, 2, 3, 4]
=> [1, 2, 3, 1, 2, 3, 4]
indices = a.each_with_index.inject(Hash.new { Array.new }) do |hash, (obj, i)|
hash[obj] += [i]
hash
end
=> { 1 => [0, 3], 2 => [1, 4], 3 => [2, 5], 4 => [6] }
Это позволяет осуществлять быстрый поиск дублированных записей:
indices.select { |k, v| v.size > 1 }
=> { 1 => [0, 3], 2 => [1, 4], 3 => [2, 5] }