Ответ 1
Вы можете использовать Set. Он реализован поверх Hash и будет быстрее для больших наборов данных - O (1).
require 'set'
s = Set.new ['1.1.1.1', '1.2.3.4']
# => #<Set: {"1.1.1.1", "1.2.3.4"}>
s.include? '1.1.1.1'
# => true
script должен проверить, присутствует ли один предопределенный IP-адрес в большом массиве IP-адресов. В настоящее время я кодирую эту функцию следующим образом (говоря, что "ips" - это мой массив IP, а "ip" - предопределенный ip)
ips.each do |existsip|
if ip == existsip
puts "ip exists"
return 1
end
end
puts "ip doesn't exist"
return nil
Есть ли более быстрый способ сделать то же самое?
Правка: Я, возможно, неправильно выразился. Я могу сделать array.include? но я хотел бы знать: Is array.include? метод, который даст мне самый быстрый результат?
Вы можете использовать Set. Он реализован поверх Hash и будет быстрее для больших наборов данных - O (1).
require 'set'
s = Set.new ['1.1.1.1', '1.2.3.4']
# => #<Set: {"1.1.1.1", "1.2.3.4"}>
s.include? '1.1.1.1'
# => true
Вы можете использовать метод include Array #, чтобы вернуть true/false.
http://ruby-doc.org/core-1.9.3/Array.html#method-i-include-3F
if ips.include?(ip) #=> true
puts 'ip exists'
else
puts 'ip doesn\'t exist'
end
Более быстрый способ:
if ips.include?(ip)
puts "ip exists"
return 1
else
puts "ip doesn't exist"
return nil
end
Вы пытались включить Array # include? функция?
http://ruby-doc.org/core-1.9.3/Array.html#method-i-include-3F
Из источника вы можете видеть почти то же самое, кроме изначально.
ips = ['10.10.10.10','10.10.10.11','10.10.10.12']
ip = '10.10.10.10'
ips.include?(ip) => true
ip = '10.10.10.13'
ips.include?(ip) => false