2017-02-27 100 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}