Ruby bir dizin karma bir diziye dönüştürmek
Bir dizi var, ve hızlı bir şekilde soracağım bir karma yapmak istiyorum "X dizisi mi?".
Perl, bunu yapmak için (ve hızlı) kolay bir yolu var:
my @array = qw( 1 2 3 );
my %hash;
@hash{@array} = undef;
Bu gibi görünen bir karma oluşturur:
{
1 => undef,
2 => undef,
3 => undef,
}
Ruby ile geldim en iyisidir:
array = [1, 2, 3]
hash = Hash[array.map {|x| [x, nil]}]
hangi verir:
{1=>nil, 2=>nil, 3=>nil}
Ruby daha iyi bir yolu var mı?
1 DÜZENLEYİN
Hayır, Dizi.vardır? iyi bir fikir değil. Onunyavaş. O(1) yerine O bir sorgu(n) yapar. Örnek benim dizisi kısa olması için üç unsur vardı; varsayalım gerçek bir milyon öğeler vardır. Hadi küçük bir kıyaslama yapın:
#!/usr/bin/ruby -w
require 'benchmark'
array = (1..1_000_000).to_a
hash = Hash[array.map {|x| [x, nil]}]
Benchmark.bm(15) do |x|
x.report("Array.include?") { 1000.times { array.include?(500_000) } }
x.report("Hash.include?") { 1000.times { hash.include?(500_000) } }
end
Üretir:
user system total real
Array.include? 46.190000 0.160000 46.350000 ( 46.593477)
Hash.include? 0.000000 0.000000 0.000000 ( 0.000523)
CEVAP
Eğer üyelik için karma gerekiyorsa, Set
bir kullanmayı düşünün:
Ayarlayın
Set ile sırasız değerler topluluğu uygular çoğaltır. Bu Dizi ınter-operasyon sezgisel bir melez. tesisleri ve Karma hızlı arama.
Set Enumerable nesnelerle kullanımı kolay (uygulama * *2). En başlatıcı yöntemleri ve ikili operatörler kabul kümeler ve diziler ayrıca Enumerable genel nesneler. Bir Enumerable nesne Set kullanarak dönüştürülebilir
to_set
yöntem.Set aşağıdaki noktaları dikkate almanız gerekir yani depolama olarak Karma kullanır:
- Elementlerin eşitlik
Object#eql?
Object#hash
göre belirlenir.- Set her elementin kimliğini saklı olsa da değişmez olduğunu varsayar. Değiştirme bir dizi unsuru bir set işlerler değiştirme güvenilmez devlet.
- Bir dize depolanan olduğunda, dize dondurulmuş bir kopyasını özgün dize zaten donmuş olduğu sürece yerine saklanır.
Karşılaştırma
Karşılaştırma
<
,>
,<=
ve>=
olarak uygulanır operatörleri steno {proper_,}{alt sanıyorsunuz?üst?} yöntemleri. Ancak, 10 ** operatör kasıtlı olarak her çifti çünkü dışarı bırakılır ayarlar karşılaştırılabilir. ({x,y} örneğin vs {x,z})Örnek
require 'set' s1 = Set.new [1, 2] # -> #<Set: {1, 2}> s2 = [1, 2].to_set # -> #<Set: {1, 2}> s1 == s2 # -> true s1.add("foo") # -> #<Set: {1, 2, "foo"}> s1.merge([2, 6]) # -> #<Set: {1, 2, "foo", 6}> s1.subset? s2 # -> false s2.subset? s1 # -> true
[...]
Genel Sınıf Yöntemleri
yeni(numaralama = nil)
Yeni bir dizi verilen sayısız öğeleri içeren oluşturur nesne.
Eğer bir blok verilirse, numaralama elemanları tarafından preprocessed blok verildi.
sembol olarak anahtar ile ruby karma f...
Nasıl ruby karma bir nesneyi JSON dönü...
Ruby bir karma için bir dizi dönüştürm...
Ruby karma json dönüştürmek...
Ruby Nesne Karma dönüştürmek...