Самый быстрый способ найти строку в массиве строк - PullRequest
18 голосов
/ 16 февраля 2012

Сценарий должен проверить, присутствует ли один предопределенный 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?но я хотел бы знать следующее: является ли array.include?метод, который даст мне самый быстрый результат?

Ответы [ 5 ]

34 голосов
/ 16 февраля 2012

Вы можете использовать Установить .Он реализован поверх 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 
4 голосов
/ 16 февраля 2012

Вы можете использовать метод Array # include, чтобы вернуть вам 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
3 голосов
/ 16 февраля 2012

Более быстрый способ будет:

if ips.include?(ip)
  puts "ip exists"
  return 1
else
  puts "ip doesn't exist"
  return nil
end
2 голосов
/ 16 февраля 2012
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

см. Документацию здесь

2 голосов
/ 16 февраля 2012

вы пробовали включить массив Array #? функционировать?

* ** 1003 тысяча два *http://ruby -doc.org / ядро-1.9.3 / Array.html # метод-я-включать-3F

Вы можете видеть из источника, что он делает почти то же самое, за исключением нативного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...