2012-06-08 12 views
5

BenRuby dizisini bir dizi anahtar verilen bir karma haline dönüştürün mü?

array = ["apple", "orange", "lemon"] 

array2 = [["apple", "good taste", "red"], ["orange", "bad taste", "orange"], ["lemon" , "no taste", "yellow"]] 

nasıl ben dizideki eleman dizi2 her elemanın ilk elemanını eşleştirdiğinde bu karma için dönüştürebilirsiniz bir basit dizi var?

hash = {"apple" => ["apple" ,"good taste", "red"], 
     "orange" => ["orange", "bad taste", "orange"], 
     "lemon" => ["lemon" , "no taste", "yellow"] } 

Ben Yakut oldukça yeni, ve bu manipülasyon yapmak için bir sürü, ama hiç şans, herhangi bir yardım geçirmek?

+0

tam olarak "dizi2 her elemanın ilk elemanını maç" ile ne demek istiyorsunuz? – Mischa

+4

Cevabımı düzenleme, bir yorum bırakma – Mischa

cevap

10

, o zaman hiç array gerekmez:

array2 = [ 
    ["apple", "good taste", "red"], 
    ["lemon" , "no taste", "yellow"], 
    ["orange", "bad taste", "orange"] 
] 

map = Hash[ array2.map{ |a| [a.first,a] } ] 
p map 
#=> { 
#=> "apple"=>["apple", "good taste", "red"], 
#=> "lemon"=>["lemon", "no taste", "yellow"], 
#=> "orange"=>["orange", "bad taste", "orange"] 
#=> } 

Kullanmak isterseniz array elemanlarının alt grubunu seçmek için, o zaman bunu yapabilirsiniz:

# Use the map created above to find values efficiently 
array = %w[orange lemon] 
hash = Hash[ array.map{ |val| [val,map[val]] if map.key?(val) }.compact ] 
p hash 
#=> { 
#=> "orange"=>["orange", "bad taste", "orange"], 
#=> "lemon"=>["lemon", "no taste", "yellow"] 
#=> } 

kodu if map.key?(val) ve compact, array, array2'da bulunmayan anahtarları sorduğunda bir sorun olmadığını ve O(n) zamanında gerçekleştirilmesini sağlar.

+0

Bu, aşağıdaki gereksinimi dikkate almaz: "dizideki eleman dizi2'deki her öğenin ilk öğesiyle eşleştiğinde". – Mischa

+0

@Mischa Şimdi yapar. :) – Phrogz

2

İstediğiniz sonucu alır. Anahtar ve çiftleri arasındaki haritalama sırası array2 ilk elemana dayalı olmalıdır olursa

hash = {} 

array.each do |element| 
    i = array2.index{ |x| x[0] == element } 
    hash[element] = array2[i] unless i.nil? 
end 
+0

Merhaba, thx, dizi2 sırayla değilse ne olacak? –

+1

Bu sizin sorunuzdan belli değil. Bir dahaki sefere örneğinizde ne istediğinizi daha açık bir şekilde yansıtın. Elma, portakal ve limon, dizi2'de bir kereden fazla meydana gelebilir, eğer öyleyse, sonuçta elde edilen hashın nasıl görünmesini istersiniz. Lütfen sorunuza açık bir örnek ve beklenen çıktıyla güncelleyin. – Mischa

+0

@KitHo, bu dizi sırayla değilse çalışır. – Mischa

-1

ohh..I aşağıdaki rassoc

kontrol dışarı geçersiz kılmak için cazip irb

class Array 
    def rassoc obj, place=1 
    if place 
     place = place.to_i rescue -1 
     return if place < 0 
    end 

    self.each do |item| 
     next unless item.respond_to? :include? 

     if place 
     return item if item[place]==obj 
     else 
     return item if item.include? obj 
     end 
    end 

    nil 
    end 
end 

array = ["apple", "orange", "lemon"] 
array2 = [["apple", "good taste", "red"], ["orange", "bad taste", "orange"], ["lemon" , "no taste", "yellow"]] 

Hash[ array.map{ |fruit| [fruit, array2.rassoc(fruit, nil)]}] 
# this is what you want 

# order changed 
array2 = [["good taste", "red", "apple"], ["no taste", "lemon", "yellow"], ["orange", "bad taste", "orange"]] 

Hash[ array.map{ |fruit| [fruit, array2.rassoc(fruit, nil)]}] 
# same what you want after order is changed 
İlgili konular