web-dev-qa-db-ja.com

文字列を文字列の配列に見つける最速の方法

スクリプトは、1つの事前定義された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ですか?私に最速の結果を与える方法?

18
Cocotton

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 
34

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
4
ericraio

より高速な方法は次のとおりです。

if ips.include?(ip)
  puts "ip exists"
  return 1
else
  puts "ip doesn't exist"
  return nil
end
3
Don Cruickshank

array#includeを試しましたか?関数?

http://Ruby-doc.org/core-1.9.3/Array.html#method-i-include-3F

ソースから、ネイティブを除いてほぼ同じことをしていることがわかります。

2
Peter Ehrlich
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
dku.rajkumar