如何返回在某个阈值下发生的数组项的索引

时间:2011-08-10 09:31:04

标签: ruby arrays

在Ruby中,给定一个元素数组,返回不相同元素索引的最简单方法是什么?

array = ['a','b','a','a','a','c'] #=> [1,5]

扩大问题:

假设身份阈值基于数组中最常见的元素。

array =  ['a','c','a','a','a','d','d'] #=> [1,5,6]

对于具有两个同等频繁元素的数组,返回2个元素之一的索引。 e.g。

array = ['a','a','a','b','b','b'] #=>[0,1,2] or #=> [3,4,5]

2 个答案:

答案 0 :(得分:1)

目前还不太清楚你在寻找什么,但你想要的却是这样吗?

array = ['a','b','a','a','a','c']
array.uniq.inject([]) do |arr, elem| 
  if array.count(elem) == 1
    arr << array.index(elem)
  end
  arr
end

# => [1,5]

答案 1 :(得分:1)

问题编辑后编辑的答案:

def idx_by_th(arr)
    idx = [] 
    occur = arr.inject(Hash.new(0)) { |k,v| k[v] += 1; k }
    th = arr.sort_by { |v| occur[v] }.last
    arr.each_index {|i| idx << i if arr[i]!=th}
    idx
end

idx_by_th ['a','b','a','a','a','c']  # => [1, 5]
idx_by_th ['a','c','a','a','a','d','d'] # => [1, 5, 6]
idx_by_th ['a','a','a','b','b','b'] # => [0, 1, 2]

这些答案对问题的第一个版本有效:

ruby​​&lt; 1.8.7

def get_uniq_idx(arr)
    test=[]; idx=[]
    arr.each_index do |i|
        idx << i if !(arr[i+1..arr.length-1] + test).include?(arr[i])
        test << arr[i]
    end
    return idx
end

puts get_uniq_idx(['a','b','a','a','a','c']).inspect # => [1, 5]

ruby​​&gt; = 1.8.7:

idxs=[]
array.each_index {|i| idxs<<i if !(array.count(array[i]) > 1)}
puts idxs.inspect # => [1, 5]