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