2017-02-27 98 views
1

陣列要做出這樣的轉換,但沒有得到正確的結果哈希與價值

old = { 
     1 => %w(A E I O U L N R S T), 
     2 => %w(D G), 
     3 => %w(B C M P), 
     4 => %w(F H V W Y), 
     5 => %w(K), 
     8 => %w(J X), 
     10 => %w(Q Z) 
    } 

expected = { 
    'a' => 1, 'b' => 3, 'c' => 3, 'd' => 2, 'e' => 1, 
    'f' => 4, 'g' => 2, 'h' => 4, 'i' => 1, 'j' => 8, 
    'k' => 5, 'l' => 1, 'm' => 3, 'n' => 1, 'o' => 1, 
    'p' => 3, 'q' => 10, 'r' => 1, 's' => 1, 't' => 1, 
    'u' => 1, 'v' => 4, 'w' => 4, 'x' => 8, 'y' => 4, 
    'z' => 10 
} 

實現我的嵌套的循環轉換。我認爲,雖然內循環循環,外循環不會增加。這裏是我的代碼:

class Etl 

    def self.transform(old) 

     result = {} 

     old.each do |key, value| 
      value.each_with_index do |v, i| 
       result[v[i]] = key 
      end 
     end 

     result 

    end 


end 
+0

逆散列部很有趣,但作爲一個整體,這是一個不好的問題,因爲downcasing無關,用它做。你應該把它們分成單獨的問題。 – sawa

回答

5

你並不需要使用索引,只需使用v

def self.transform(old) 
    result = {} 
    old.each do |key, value| 
     value.each do |v| 
      result[v.downcase] = key 
     end 
    end 
    result 
end 

注:使用String#downcase到期望的散列的主要情況相匹配。


使用替代Array#mapEnumerable#flat_mapEnumerable#to_h

def self.transform(old) 
    old.flat_map { |key, value| 
     value.map { |v| 
     [v.downcase, key] 
     } 
    }.sort.to_h 
end 
+1

你可以在'to_h'之前加入'sort'。 – Stefan

+0

@Stefan,感謝您的評論。我相應地在'.to_h'之前加了'.sort'。 – falsetru

2
old.flat_map { |k, v| v.map(&:downcase).product([k]) }.sort.to_h 
    #=> {"a"=>1, "b"=>3, "c"=>3, "d"=>2, "e"=>1, "f"=>4, "g"=>2, "h"=>4, "i"=>1, 
    # "j"=>8, "k"=>5, "l"=>1, "m"=>3, "n"=>1, "o"=>1, "p"=>3, "q"=>10, "r"=>1, 
    # "s"=>1, "t"=>1, "u"=>1, "v"=>4, "w"=>4, "x"=>8, "y"=>4, "z"=>10}