Answers:
将数组转换为哈希。然后寻找钥匙。
array = ['a', 'b', 'c']
hash = Hash[array.map.with_index.to_a] # => {"a"=>0, "b"=>1, "c"=>2}
hash['b'] # => 1
为什么不使用index或rindex?
array = %w( a b c d e)
# get FIRST index of element searched
puts array.index('a')
# get LAST index of element searched
puts array.rindex('a')
索引:http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-index
rindex:http ://www.ruby-doc.org/core-1.9.3/Array.html#method-i-rindex
其他答案未考虑数组中多次列出条目的可能性。这将返回一个哈希值,其中每个键是数组中的唯一对象,每个值是对应于对象所在位置的索引数组:
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] }
如果是排序数组,则可以使用二进制搜索算法(O(log n)
)。例如,使用以下功能扩展Array-class:
class Array
def b_search(e, l = 0, u = length - 1)
return if lower_index > upper_index
midpoint_index = (lower_index + upper_index) / 2
return midpoint_index if self[midpoint_index] == value
if value < self[midpoint_index]
b_search(value, lower_index, upper_index - 1)
else
b_search(value, lower_index + 1, upper_index)
end
end
end
如果您的数组具有自然顺序,请使用二进制搜索。
使用二进制搜索。
二进制搜索具有O(log n)
访问时间。
以下是有关如何使用二进制搜索的步骤,
bsearch
找到的元素或指数代码示例
# assume array is sorted by name!
array.bsearch { |each| "Jamie" <=> each.name } # returns element
(0..array.size).bsearch { |n| "Jamie" <=> array[n].name } # returns index