2014-09-19 67 views
0

我有一些数据以['a1', 'b321', 'a33', 'c', ...]的形式排列为数组。 我想把所有的'aN'放入sorted_data[:a]等。 下面的代码循环遍历数据,并正确地在它们上运行正则表达式。 它没有做的是把它们放在正确的地方 - sorted_data[filter[:key]]为空。 如何使用filter[:key]作为sorted_data的关键? 谢谢。在哈希中使用变量作为另一个哈希的关键

sorted_data = { a: Array.new, 
       b: Array.new, 
       c: -1 } 

filters = [{ re: /^a\d+$/, key: 'a' }, 
      { re: /^b\d+$/, key: 'b' }, 
      { re: /^c$/, key: 'c' }] 

['a1', 'b321', 'a33', 'c', 'b', 'b1'].each {|cell| 
    filters.each {|filter| 
    if cell.match(filter[:re]) 
     puts "#{cell} should go in #{filter[:key]}" + '....[' + sorted_data[filter[:key]].to_s + ']....' 
     break 
    end 
    } 
} 

的上述输出是

# a1 should go in a....[].... 
# b321 should go in b....[].... 
# a33 should go in a....[].... 
# c should go in c....[].... 
# b1 should go in b....[].... 
+0

也许是因为':一个!='a''? – 2014-09-19 11:00:28

+0

你能更有帮助吗? – gotofritz 2014-09-19 11:17:43

+0

'sorted_data'具有符号键(':a,:b,:c'),'filters'将键定义为字符串('“a”,“b”,“c”') – 2014-09-19 16:36:07

回答

0

相信下面的程序产生所需的输出:

l = ['a1', 'b321', 'a33', 'c', 'b', 'b1'] 
sorted_data = Hash.new { |hash, key| hash[key] = [] } 
l.each do |item| 
    first_char = item[0].to_sym 
    sorted_data[first_char].push item 
end 

puts sorted_data 

输出:

{:a=>["a1", "a33"], :b=>["b321", "b", "b1"], :c=>["c"]} 
+0

那么,我需要做什么是更复杂的,我简化问问题 - 我确实需要RegExp。但是,谢谢,你的回答告诉我我做错了什么 - 我需要to_sym! – gotofritz 2014-09-19 11:22:10

+1

哦,好吧......我以为你只是用正则表达式来识别每个数组元素。很高兴我能帮上忙 – arturhoo 2014-09-19 11:42:44