Bir değer 'Dog'
ve bir dizi var ['Cat', 'Dog', 'Bird']
.
Dizide döngü olmadan var olup olmadığını nasıl kontrol edebilirim? Değerin olup olmadığını kontrol etmenin basit bir yolu var mı?
Bir değer 'Dog'
ve bir dizi var ['Cat', 'Dog', 'Bird']
.
Dizide döngü olmadan var olup olmadığını nasıl kontrol edebilirim? Değerin olup olmadığını kontrol etmenin basit bir yolu var mı?
Yanıtlar:
Şunu arıyorsunuz include?
:
>> ['Cat', 'Dog', 'Bird'].include? 'Dog'
=> true
%w(Cat Dog Bird).include? 'Dog'
#include?
hala döngü gerçekleştirdiğini not edeyim . Ancak kodlayıcı, döngüyü açıkça yazmaktan saklanır. Görevi gerçekten döngü olmadan gerçekleştiren bir cevap ekledim.
Bir vardır in?
yöntem içinde ActiveSupport
@campaterson ile sivri dışarı olarak v3.1 yana (Rayların parçası). Yani Rails içinde, ya da sen require 'active_support'
, sen yazabilirsin:
'Unicorn'.in?(['Cat', 'Dog', 'Bird']) # => false
OTOH, daha önce önerilmiş olmasına rağmen, Ruby'de, özellikle yakut çekirdeğin birinci sınıf üyesi Yusuke Endoh tarafından hiçbir in
operatör veya #in?
yöntem yoktur .
Diğerleri tarafından işaret edildiği gibi, ters yöntem include?
tüm için var Enumerable
dahil sArray
, Hash
, Set
, Range
:
['Cat', 'Dog', 'Bird'].include?('Unicorn') # => false
Dizinizde çok sayıda değer varsa bunların hepsinin birbiri ardına kontrol edileceğini unutmayın (ör. O(n)
), bir karma aramanın sabit zaman (yani O(1)
) olacağını unutmayın . Örneğin, dizi sabitse, bunun yerine bir Set kullanmak iyi bir fikirdir . Örneğin:
require 'set'
ALLOWED_METHODS = Set[:to_s, :to_i, :upcase, :downcase
# etc
]
def foo(what)
raise "Not allowed" unless ALLOWED_METHODS.include?(what.to_sym)
bar.send(what)
end
Bir hızlı testi bu çağrı ortaya koymaktadırinclude?
10 elemana Set
eşdeğer üzerinde çağırmak daha hızlı 3.5x hakkındadırArray
(eleman bulunmazsa).
Son bir kapanış notu: include?
a kullanırken dikkatli olun Range
, incelikler var, bu yüzden dokümana bakın vecover?
...
#in?
çekirdeğinde yer almasa da, Rails kullanıyorsanız, kullanılabilir. api.rubyonrails.org/classes/Object.html#method-i-in-3F (Bunun bir Ruby olduğunu, Rails sorusu olmadığını biliyorum, ancak Rails'te kullanmak isteyen herkes için yardımcı olabilir. Rails'e#in?
eklendi gibi görünüyor. 3.1 apidock.com/rails/Object/in%3F
Deneyin
['Cat', 'Dog', 'Bird'].include?('Dog')
Kullanım Enumerable#include
:
a = %w/Cat Dog Bird/
a.include? 'Dog'
Ya da, bir dizi test yapılırsa, 1 döngüden (hatta include?
sahip olan) kurtulabilir ve O (n) ' den O (1)' e gidebilirsiniz :
h = Hash[[a, a].transpose]
h['Dog']
Bir blokla kontrol etmek isterseniz any?
veya seçeneğini deneyebilirsiniz all?
.
%w{ant bear cat}.any? {|word| word.length >= 3} #=> true
%w{ant bear cat}.any? {|word| word.length >= 4} #=> true
[ nil, true, 99 ].any? #=> true
Bkz Enumerable fazla bilgi için .
Benim ilham kaynağım " dizi yakut herhangi bir öğe olup olmadığını değerlendirmek "
Ruby'nin bir dizideki öğeleri bulmak için on bir yöntemi vardır.
Tercih edilen include?
veya tekrarlanan erişim için bir Set oluşturup ardından include?
veya öğesini çağırır member?
.
İşte hepsi:
array.include?(element) # preferred method
array.member?(element)
array.to_set.include?(element)
array.to_set.member?(element)
array.index(element) > 0
array.find_index(element) > 0
array.index { |each| each == element } > 0
array.find_index { |each| each == element } > 0
array.any? { |each| each == element }
array.find { |each| each == element } != nil
array.detect { |each| each == element } != nil
true
Öğe varsa, hepsi bir ish değeri döndürür .
include?
tercih edilen yöntemdir. for
Bir öğe dahili rb_equal_opt/rb_equal
işlevlerle eşleştiğinde kırılan dahili olarak bir C dili döngüsü kullanır . Tekrarlanan üyelik kontrolleri için bir Set oluşturmazsanız çok daha verimli olamaz.
VALUE
rb_ary_includes(VALUE ary, VALUE item)
{
long i;
VALUE e;
for (i=0; i<RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
switch (rb_equal_opt(e, item)) {
case Qundef:
if (rb_equal(e, item)) return Qtrue;
break;
case Qtrue:
return Qtrue;
}
}
return Qfalse;
}
member?
Array
sınıfta yeniden tanımlanmaz ve Enumerable
modülden tam anlamıyla tüm öğeler arasında numaralandırılan optimize edilmemiş bir uygulama kullanır :
static VALUE
member_i(RB_BLOCK_CALL_FUNC_ARGLIST(iter, args))
{
struct MEMO *memo = MEMO_CAST(args);
if (rb_equal(rb_enum_values_pack(argc, argv), memo->v1)) {
MEMO_V2_SET(memo, Qtrue);
rb_iter_break();
}
return Qnil;
}
static VALUE
enum_member(VALUE obj, VALUE val)
{
struct MEMO *memo = MEMO_NEW(val, Qfalse, 0);
rb_block_call(obj, id_each, 0, 0, member_i, (VALUE)memo);
return memo->v2;
}
Ruby koduna çevrildiğinde bu aşağıdakilerle ilgilidir:
def member?(value)
memo = [value, false, 0]
each_with_object(memo) do |each, memo|
if each == memo[0]
memo[1] = true
break
end
memo[1]
end
Hem include?
ve member?
yana O (n) zaman karmaşıklığı sahip hem beklenen değerin ilk oluşum için bir dizi arama.
İlk önce dizinin Hash temsilini oluşturmak zorunda kalmadan O (1) erişim süresini elde etmek için bir Set kullanabiliriz. Aynı dizideki üyeliği tekrar tekrar kontrol ederseniz, bu ilk yatırım hızlı bir şekilde ödenebilir. Set
C dilinde değil, temel Ruby sınıfı olarak uygulanmış, yine de altta yatan O (1) erişim süresi@hash
buna değer.
Set sınıfının uygulanması:
module Enumerable
def to_set(klass = Set, *args, &block)
klass.new(self, *args, &block)
end
end
class Set
def initialize(enum = nil, &block) # :yields: o
@hash ||= Hash.new
enum.nil? and return
if block
do_with_enum(enum) { |o| add(block[o]) }
else
merge(enum)
end
end
def merge(enum)
if enum.instance_of?(self.class)
@hash.update(enum.instance_variable_get(:@hash))
else
do_with_enum(enum) { |o| add(o) }
end
self
end
def add(o)
@hash[o] = true
self
end
def include?(o)
@hash.include?(o)
end
alias member? include?
...
end
Set sınıfının yalnızca dahili bir @hash
örnek oluşturduğunu görebileceğiniz gibi, tüm nesneleri eşler ve Hash sınıfında O (1) erişim süresi ile uygulanan true
üyeliği denetler Hash#include?
.
Diğer yedi yöntemi daha az verimli oldukları için tartışmayacağım.
Aslında yukarıda listelenen 11'in ötesinde O (n) karmaşıklığına sahip daha fazla yöntem var, ancak ilk maçta kırmak yerine tüm diziyi taradıkları için bunları listelememeye karar verdim.
Bunları kullanmayın:
# bad examples
array.grep(element).any?
array.select { |each| each == element }.size > 0
...
11
sıraladığınız yolları sorgulayayım . İlk olarak, aynı yöntem için sadece farklı isimler olduklarından index
ve find_index
(veya find
ve detect
) ayrı yöntemler olarak zorlukla sayabilirsiniz . İkincisi, ile biten tüm ifadeler > 0
yanlış, ki bu bir gözetim olduğundan eminim. (devamı)
arr.index(e)
, örneğin, 0
if değerini döndürür arr[0] == e
. Mevcut değilse arr.index(e)
iadeleri hatırlayacaksınız . biri arıyorsa, ancak, kullanılamaz içinde . ( Listelenmeyen ile aynı sorun .). Diziyi bir kümeye dönüştürmek ve sonra küme yöntemlerini kullanmak biraz esnektir. Neden bir karma değerine (dizideki anahtarlar ve rastgele değerler ile) dönüştürmüyorsunuz, sonra karma yöntemlerini kullanmıyorsunuz? Bir kümeye dönüştürmek uygun olsa bile, kullanılabilecek başka küme yöntemleri de vardır . (devamı)nil
e
index
nil
arr
rindex
!arr.to_set.add?(e)
arr.count(e) > 0
, arr != arr.dup.delete(e)
, arr != arr - [e]
ve arr & [e] == [e]
. Bir de istihdam edilebilir select
ve reject
.
Birkaç cevap öne sürüyor Array#include?
, ancak önemli bir uyarı var: Kaynağa bakmak, hatta Array#include?
döngü yapıyor:
rb_ary_includes(VALUE ary, VALUE item)
{
long i;
for (i=0; i<RARRAY_LEN(ary); i++) {
if (rb_equal(RARRAY_AREF(ary, i), item)) {
return Qtrue;
}
}
return Qfalse;
}
Kelime varlığını döngü olmadan test etmenin yolu diziniz için bir üçlü yapı oluşturmaktır . Orada birçok trie uygulaması vardır (google "ruby trie"). rambling-trie
Bu örnekte kullanacağım :
a = %w/cat dog bird/
require 'rambling-trie' # if necessary, gem install rambling-trie
trie = Rambling::Trie.create { |trie| a.each do |e| trie << e end }
Ve şimdi dizinizdeki çeşitli kelimelerin varlığını, döngü içinde olmadan, O(log n)
zaman içinde, alt Array#include?
doğrusal kullanarak aynı sözdizimsel basitlikle test etmeye hazırız Trie#include?
:
trie.include? 'bird' #=> true
trie.include? 'duck' #=> false
a.each do ... end
Umm ... bunun bir döngü olmadığından emin değilim
Set#include?
verimlilikten endişe duyan insanlar için daha önce bahsedilen bir yanıta dikkat edin ; dizeler yerine semboller kullanıldığında, ortalama O (1) büyük / küçük harf olabilir (dizeleri kullanırsanız, yalnızca karma değerini hesaplamak O (n) 'dir, burada n dizgenin uzunluğudur). Veya üçüncü taraf kütüphaneleri kullanmak istiyorsanız, O (1) en kötü durum olan mükemmel bir karma kullanabilirsiniz.
Set
üyelerini endekslemek için karma kullanır, bu nedenle karma için iyi dağıtılmış (daha spesifik olarak O (giriş boyutu) ve O (log (n / kova numarası)) için karmaşık O (1) Set#include?
olmalıdırSet
. arama)
Döngü yapmak istemiyorsanız, bunu Dizilerle yapmanın bir yolu yoktur. Bunun yerine bir Set kullanmalısınız.
require 'set'
s = Set.new
100.times{|i| s << "foo#{i}"}
s.include?("foo99")
=> true
[1,2,3,4,5,6,7,8].to_set.include?(4)
=> true
Kümeler Hashes gibi dahili olarak çalışır, bu nedenle Ruby'nin öğeleri bulmak için koleksiyonda döngü yapmasına gerek yoktur, çünkü adından da anlaşılacağı gibi, anahtarların karmasını oluşturur ve her karmanın bellekteki belirli bir noktayı işaret etmesi için bir bellek haritası oluşturur. Hash ile yapılan önceki örnek:
fake_array = {}
100.times{|i| fake_array["foo#{i}"] = 1}
fake_array.has_key?("foo99")
=> true
Dezavantajı, Setler ve Hash anahtarlarının yalnızca benzersiz öğeleri içerebilmesidir ve çok fazla öğe eklerseniz, Ruby, daha büyük bir anahtar boşluğuna uyan yeni bir harita oluşturmak için belirli sayıda öğeden sonra her şeyi yeniden oluşturmanız gerekir. Bu konuda daha fazla bilgi için, " MountainWest RubyConf 2014 - Nathan Long tarafından bir Ev Yapımı Hash Big Big " izlemenizi öneririz .
İşte bir kıyaslama:
require 'benchmark'
require 'set'
array = []
set = Set.new
10_000.times do |i|
array << "foo#{i}"
set << "foo#{i}"
end
Benchmark.bm do |x|
x.report("array") { 10_000.times { array.include?("foo9999") } }
x.report("set ") { 10_000.times { set.include?("foo9999") } }
end
Ve sonuçlar:
user system total real
array 7.020000 0.000000 7.020000 ( 7.031525)
set 0.010000 0.000000 0.010000 ( 0.004816)
include?
ilk vuruşta durmuyor mu?
include?
ilk isabette durur, ancak bu isabet listenin sonundaysa .... Depolama için bir Array'a dayanan herhangi bir çözüm, liste büyüdükçe, özellikle liste. Hash ve Set'in bu sorunu yok, sıralı bir liste ve ikili arama da yok.
Bu, bunu yapmanın başka bir yoludur: Array#index
yöntemi kullanın .
Dizideki öğenin ilk oluşumunun dizinini döndürür.
Örneğin:
a = ['cat','dog','horse']
if a.index('dog')
puts "dog exists in the array"
end
index()
ayrıca bir blok alabilir:
Örneğin:
a = ['cat','dog','horse']
puts a.index {|x| x.match /o/}
Bu, dizideki 'o' harfini içeren ilk sözcüğün dizinini döndürür.
index
hala dizi üzerinden yinelenir, sadece öğenin değerini döndürür.
Eğlenceli gerçek,
İfadelerde *
dizi üyeliğini kontrol etmek için kullanabilirsiniz case
.
case element
when *array
...
else
...
end
*
When yan tümcesinde küçük fark edin , bu dizi üyeliği kontrol eder.
Uyarıcı operatörünün her zamanki sihir davranışı geçerlidir, örneğin array
gerçekte bir dizi değil, tek bir elemansa bu elemanla eşleşir.
when
mümkün olan en son , daha hızlı kontroller, hızlı bir şekilde ayık olsun kullanabilirsiniz.
Bunu başarmanın birçok yolu vardır. Bunlardan birkaçı aşağıdaki gibidir:
a = [1,2,3,4,5]
2.in? a #=> true
8.in? a #=> false
a.member? 1 #=> true
a.member? 8 #=> false
Object#in?
yalnızca Rails (yani ActiveSupport
) v3.1 + 'a eklendiğine dikkat edin . Temel Ruby'de mevcut değildir.
Eğer herhangi bir anahtar dönüştürmek için katları kere kontrol gerekiyorsa arr
için hash
O (1) kontrol edin şimdi, ve
arr = ['Cat', 'Dog', 'Bird']
hash = arr.map {|x| [x,true]}.to_h
=> {"Cat"=>true, "Dog"=>true, "Bird"=>true}
hash["Dog"]
=> true
hash["Insect"]
=> false
Hash # has_key performansı ? Array # 'a karşı ?
Parametre Hash # has_key? Dizi # include Zaman Karmaşıklığı O (1) işlemi O (n) işlemi Erişim Türü Her öğede yineliyorsa Karma [anahtar] 'a erişir dizinin herhangi bir değerini, diziye kadar döndürür true, Array'daki değeri bulur Hash # has_key? aramak aramak
Tek seferlik kontrol include?
kullanımı iyidir
Bu size sadece var olduğunu değil, aynı zamanda kaç kez göründüğünü de söyleyecektir:
a = ['Cat', 'Dog', 'Bird']
a.count("Dog")
#=> 1
.any?
eşleme göründüğünü bilmek istemiyorsanız bunu kullanmanın bir anlamı yoktur, ancak ilk eşleşen öğeyi bulur bulmaz geri döner .count
, tüm diziyi her zaman işler.
Değerine göre , Ruby belgeleri bu tür sorular için harika bir kaynaktır.
Ayrıca aradığınız dizinin uzunluğunu da dikkate alırdım. include?
Yöntem dizisinin boyutuna bağlı olarak oldukça çirkin almak O (n) karmaşıklığı olan bir doğrusal arama yapacaktır.
Büyük (sıralanmış) bir dizi ile çalışıyorsanız, çok zor olmamalı ve en kötü O (log n) durumuna sahip bir ikili arama algoritması yazmayı düşünürdüm .
Veya Ruby 2.0 kullanıyorsanız yararlanabilirsiniz bsearch
.
<=>
, bu her zaman böyle değildir. Örneğin, dizinin öğelerinin karma olduğunu varsayalım.
Deneyebilirsin:
Örnek: Dizide Cat ve Dog varsa:
(['Cat','Dog','Bird'] & ['Cat','Dog'] ).size == 2 #or replace 2 with ['Cat','Dog].size
Onun yerine:
['Cat','Dog','Bird'].member?('Cat') and ['Cat','Dog','Bird'].include?('Dog')
Not: member?
ve include?
aynıdır.
Bu işi tek satırda yapabilir!
Kullanmamak istiyorsak include?
bu da işe yarar :
['cat','dog','horse'].select{ |x| x == 'dog' }.any?
['Cat', 'Dog', 'Bird'].detect { |x| x == 'Dog'}
=> "Dog"
!['Cat', 'Dog', 'Bird'].detect { |x| x == 'Dog'}.nil?
=> true
['Cat', nil, 'Dog'].detect { |x| x == nil } #=> nil
. Oldu nil
bulundu?
Bunu bir MiniTest birim testinde yapmaya çalışıyorsanız kullanabilirsiniz assert_includes
. Misal:
pets = ['Cat', 'Dog', 'Bird']
assert_includes(pets, 'Dog') # -> passes
assert_includes(pets, 'Zebra') # -> fails
Bunun başka yolu var.
Dizinin, [ :edit, :update, :create, :show ]
belki de yedi ölümcül / huzurlu günahın tamamı olduğunu varsayalım .
Ve bazı dize geçerli bir eylem çekme fikri ile daha fazla oyuncak :
"my brother would like me to update his profile"
Sonra:
[ :edit, :update, :create, :show ].select{|v| v if "my brother would like me to update his profile".downcase =~ /[,|.| |]#{v.to_s}[,|.| |]/}
/[,|.| |]#{v.to_s}[,|.| |]/
'virgül, nokta, boşluk veya hiçbir şeyle çevrili eylemin adını' bulmak istediğinizi düşündürüyor, ancak bazı ince hatalar var. "|update|"
dönecekti [:update]
ve "update"
dönecekti []
. Karakter sınıfları ( [...]
) |
karakterleri ayırmak için dikey çizgi ( ) kullanmaz . Onları gruplar ( (...)
) olarak değiştirsek bile boş bir karakterle eşleşemezsiniz. Muhtemelen istediğiniz regex/(,|\.| |^)#{v.to_s}(,|\.| |$)/
/[,. ]/
Değeri yalnızca doğru veya yanlış döndürmekle kalmaz,
array.find{|x| x == 'Dog'}
Bu listede varsa 'Köpek' döndürür, aksi takdirde sıfır.
array.any?{|x| x == 'Dog'}
eğer do doğru / yanlış (değil değer) istiyorum, ama aynı zamanda böyle bir blok karşı karşılaştırmak istiyorum.
İşte bunu yapmanın bir yolu daha:
arr = ['Cat', 'Dog', 'Bird']
e = 'Dog'
present = arr.size != (arr - [e]).size
arr != arr - [e]
. arr & [e] == [e]
aynı hatlar boyunca başka bir yol.
array = [ 'Cat', 'Dog', 'Bird' ]
array.include?("Dog")
herhangi bir dizide bir öğe bulmanın birçok yolu vardır, ancak en basit yol 'in?' yöntem.
example:
arr = [1,2,3,4]
number = 1
puts "yes #{number} is present in arr" if number.in? arr
kullanmak include?
istemiyorsanız, önce öğeyi bir diziye sarabilir ve ardından sarılmış öğenin dizinin ve sarılmış öğenin kesişimine eşit olup olmadığını kontrol edebilirsiniz. Bu, eşitliğe dayalı bir boole değeri döndürür.
def in_array?(array, item)
item = [item] unless item.is_a?(Array)
item == array & item
end
Bir şeyi yapmanın çeşitli yollarının göreli hızını görmek için her zaman bazı kriterler çalıştırmak ilginç buluyorum.
Başlangıç, orta veya bitişte bir dizi öğesi bulmak, doğrusal aramaları etkiler, ancak bir Kümeye karşı aramayı neredeyse hiç etkilemez.
Diziyi bir Kümeye dönüştürmek, işlem süresinde bir isabet yaratacaktır, bu nedenle Kümeyi bir Diziden bir kez oluşturun veya en baştan bir Kümeyle başlayın.
Kıyaslama kodu:
# frozen_string_literal: true
require 'fruity'
require 'set'
ARRAY = (1..20_000).to_a
SET = ARRAY.to_set
DIVIDER = '-' * 20
def array_include?(elem)
ARRAY.include?(elem)
end
def array_member?(elem)
ARRAY.member?(elem)
end
def array_index(elem)
ARRAY.index(elem) >= 0
end
def array_find_index(elem)
ARRAY.find_index(elem) >= 0
end
def array_index_each(elem)
ARRAY.index { |each| each == elem } >= 0
end
def array_find_index_each(elem)
ARRAY.find_index { |each| each == elem } >= 0
end
def array_any_each(elem)
ARRAY.any? { |each| each == elem }
end
def array_find_each(elem)
ARRAY.find { |each| each == elem } != nil
end
def array_detect_each(elem)
ARRAY.detect { |each| each == elem } != nil
end
def set_include?(elem)
SET.include?(elem)
end
def set_member?(elem)
SET.member?(elem)
end
puts format('Ruby v.%s', RUBY_VERSION)
{
'First' => ARRAY.first,
'Middle' => (ARRAY.size / 2).to_i,
'Last' => ARRAY.last
}.each do |k, element|
puts DIVIDER, k, DIVIDER
compare do
_array_include? { array_include?(element) }
_array_member? { array_member?(element) }
_array_index { array_index(element) }
_array_find_index { array_find_index(element) }
_array_index_each { array_index_each(element) }
_array_find_index_each { array_find_index_each(element) }
_array_any_each { array_any_each(element) }
_array_find_each { array_find_each(element) }
_array_detect_each { array_detect_each(element) }
end
end
puts '', DIVIDER, 'Sets vs. Array.include?', DIVIDER
{
'First' => ARRAY.first,
'Middle' => (ARRAY.size / 2).to_i,
'Last' => ARRAY.last
}.each do |k, element|
puts DIVIDER, k, DIVIDER
compare do
_array_include? { array_include?(element) }
_set_include? { set_include?(element) }
_set_member? { set_member?(element) }
end
end
Mac OS dizüstü bilgisayarımda çalıştırıldığında sonuç:
Ruby v.2.7.0
--------------------
First
--------------------
Running each test 65536 times. Test will take about 5 seconds.
_array_include? is similar to _array_index
_array_index is similar to _array_find_index
_array_find_index is faster than _array_any_each by 2x ± 1.0
_array_any_each is similar to _array_index_each
_array_index_each is similar to _array_find_index_each
_array_find_index_each is faster than _array_member? by 4x ± 1.0
_array_member? is faster than _array_detect_each by 2x ± 1.0
_array_detect_each is similar to _array_find_each
--------------------
Middle
--------------------
Running each test 32 times. Test will take about 2 seconds.
_array_include? is similar to _array_find_index
_array_find_index is similar to _array_index
_array_index is faster than _array_member? by 2x ± 0.1
_array_member? is faster than _array_index_each by 2x ± 0.1
_array_index_each is similar to _array_find_index_each
_array_find_index_each is similar to _array_any_each
_array_any_each is faster than _array_detect_each by 30.000000000000004% ± 10.0%
_array_detect_each is similar to _array_find_each
--------------------
Last
--------------------
Running each test 16 times. Test will take about 2 seconds.
_array_include? is faster than _array_find_index by 10.000000000000009% ± 10.0%
_array_find_index is similar to _array_index
_array_index is faster than _array_member? by 3x ± 0.1
_array_member? is faster than _array_find_index_each by 2x ± 0.1
_array_find_index_each is similar to _array_index_each
_array_index_each is similar to _array_any_each
_array_any_each is faster than _array_detect_each by 30.000000000000004% ± 10.0%
_array_detect_each is similar to _array_find_each
--------------------
Sets vs. Array.include?
--------------------
--------------------
First
--------------------
Running each test 65536 times. Test will take about 1 second.
_array_include? is similar to _set_include?
_set_include? is similar to _set_member?
--------------------
Middle
--------------------
Running each test 65536 times. Test will take about 2 minutes.
_set_member? is similar to _set_include?
_set_include? is faster than _array_include? by 1400x ± 1000.0
--------------------
Last
--------------------
Running each test 65536 times. Test will take about 4 minutes.
_set_member? is similar to _set_include?
_set_include? is faster than _array_include? by 3000x ± 1000.0
Temelde sonuçlar, ilk öğenin istediğim şey olduğunu garanti edemediğim sürece, içerme arayacaksam, her şey için bir Set kullanmamı söylüyor, ki bu pek olası değil. Bir hash içine öğeler eklerken bazı ek yükler var, ancak arama süreleri çok daha hızlı, bunun bir düşünülmesi gerektiğini düşünmüyorum. Yine, onu aramanız gerekirse, bir Array kullanmayın, bir Set kullanın. (Veya Karma.)
Dizi ne kadar küçükse, Dizi yöntemleri o kadar hızlı çalışır, ancak hala devam etmeyeceklerdir, ancak küçük dizilerde fark küçük olabilir.
"İlk", "Orta" ve "Son" kullanımını yansıtmak first
, size / 2
ve last
için ARRAY
için eleman olmak için aradı. Bu öğe ARRAY
ve SET
değişkenleri aranırken kullanılacaktır .
Küçük değişiklikler karşılaştırarak edildi yöntemleri için yapılmıştır > 0
testi olmalıdır çünkü >= 0
için index
tip testlerin.
Meyveli ve metodolojisi hakkında daha fazla bilgi README'sinde bulunmaktadır .