2012-02-24 39 views
19

Tôi có một chuỗi các chuỗi và muốn tạo băm. Mỗi phần tử của mảng sẽ là khóa và tôi muốn làm cho giá trị được tính từ khóa đó. Có cách nào của Ruby để làm điều này?Mảng Ruby để băm: mỗi phần tử giá trị khóa và xuất phát từ nó

Ví dụ:

['a','b'] chuyển đổi sang {'a'=>'A','b'=>'B'}

+0

Các chuỗi có duy nhất không? Điều gì nếu họ không? Bạn có muốn một ngoại lệ? –

+0

có chúng sẽ là duy nhất. Nếu họ không phải là tôi sẽ làm một uniq trước đó. – lulalala

Trả lời

49

Bạn có thể:

a = ['a', 'b'] 
Hash[a.map {|v| [v,v.upcase]}] 
+4

điều này chắc chắn hoạt động ... nhưng tôi không nghĩ rằng đó là * hiệu quả nhất * ... bạn đang lặp lại hai lần trong trường hợp này. Không phải là một mối quan tâm của khóa học với một mảng chiều dài 2, nhưng vẫn đáng chú ý. – brad

4

Dưới đây là một giải pháp ngây thơ và đơn giản có thể chuyển đổi các ký tự hiện với một biểu tượng được sử dụng như chìa khóa. Và chỉ để cho vui, nó tận dụng giá trị. :)

h = Hash.new 
['a', 'b'].each {|a| h[a.to_sym] = a.upcase} 
puts h 

# => {:a=>"A", :b=>"B"} 
1

Không chắc nếu đây là Ruby cách thật nhưng nên được gần đủ:

hash = {} 
['a', 'b'].each do |x| 
    hash[x] = x.upcase 
end 

p hash # prints {"a"=>"A", "b"=>"B"} 

Như một hàm chúng ta sẽ có điều này:

def theFunk(array) 
    hash = {} 
    array.each do |x| 
    hash[x] = x.upcase 
    end 
    hash 
end 


p theFunk ['a', 'b', 'c'] # prints {"a"=>"A", "b"=>"B", "c"=>"C"} 
3

Trong đó bao giờ cách bạn nhìn vào nó, bạn sẽ cần phải lặp lại mảng ban đầu. Dưới đây là một cách khác:

a = ['a', 'b', 'c'] 
h = Hash[a.collect {|v| [v, v.upcase]}] 
#=> {"a"=>"A", "b"=>"B", "c"=>"C"} 
21
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a} 
+0

Tôi thích giải pháp của bạn! Rất trơn! –

0

Dưới đây là một cách khác:

a.zip(a.map(&:upcase)).to_h 

#=>{"a"=>"A", "b"=>"B"} 
1

phương pháp each_with_object Ruby là một cách gọn gàng làm những gì bạn muốn

['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase } 
Các vấn đề liên quan