Итак, вопрос в том, как я могу проверить, есть ли в моем массиве уже включенная "лошадь", чтобы я не заполнил ее той же лошадью?
Пока ответыкасается просмотра массива, чтобы увидеть, существует ли конкретная строка или объект, на самом деле все идет не так, потому что, когда массив становится больше, поиск займет больше времени.
Вместо этого используйте либо Hash , или Set .Оба допускают только один экземпляр определенного элемента.Set будет вести себя ближе к массиву, но допускает только один экземпляр.Это более упреждающий подход, который позволяет избежать дублирования из-за характера контейнера.
hash = {}
hash['a'] = nil
hash['b'] = nil
hash # => {"a"=>nil, "b"=>nil}
hash['a'] = nil
hash # => {"a"=>nil, "b"=>nil}
require 'set'
ary = [].to_set
ary << 'a'
ary << 'b'
ary # => #<Set: {"a", "b"}>
ary << 'a'
ary # => #<Set: {"a", "b"}>
Хэш использует пары имя / значение, что означает, что значения не будут иметь никакого реального использования, но, похоже,немного увеличить скорость при использовании хэша, основанного на некоторых тестах.
require 'benchmark'
require 'set'
ALPHABET = ('a' .. 'z').to_a
N = 100_000
Benchmark.bm(5) do |x|
x.report('Hash') {
N.times {
h = {}
ALPHABET.each { |i|
h[i] = nil
}
}
}
x.report('Array') {
N.times {
a = Set.new
ALPHABET.each { |i|
a << i
}
}
}
end
Какой вывод:
user system total real
Hash 8.140000 0.130000 8.270000 ( 8.279462)
Array 10.680000 0.120000 10.800000 ( 10.813385)