迭代列表以将数组附加到键/值对

时间:2014-07-02 18:40:52

标签: ruby arrays hash

我有一个如下列表

ID    MODEL
001   Model A
001   Model B
001   Model C
002   Model A
002   Model B
002   Model D

我必须根据我目前正在使用的ID执行查询。它目前在列表中每行执行一个查询。似乎减少我必须运行的查询数量要快得多。

我想如果我有一个看起来像这样的哈希:

{
:001 => ["Model A", "Model B", "Model C"], 
:002 => ["Model A", "Model B", "Model D"]
}

我可以执行更少的查询。

我遇到的问题是能够确定如何迭代这样的列表并生成必要的哈希值。

现在我的代码看起来像这样:

id = parsed_line[0]
model = parsed_line[1]
hash["#{id}"] = models << model

在迭代文本文件的循环内部。其中“models”是模型列表的数组。 这里的问题是哈希看起来像这样:

{
:001 => ["Model A", "Model B", "Model C", "Model A", "Model B", "Model D"], 
:002 => ["Model A", "Model B", "Model C", "Model A", "Model B", "Model D"]
}

我理解为什么会这样,但我不明白如何获得所需的哈希值。

3 个答案:

答案 0 :(得分:2)

我在此假设parsed_line是一个如下所示的数组:[ "001", "Model A" ]。我不知道models是什么,但我认为这是不必要的。这样的事情应该有效:

parsed_lines = [ [ "001", "Model A" ],
                 [ "002", "Model B" ],
                 # ...
               ]

hash = {}

parsed_lines.each do |id, model|
  hash[id] ||= []
  hash[id] << model
end

或者,更简单地说(使用Hash.new方便的默认阻止):

hash = Hash.new {|hash, id| hash[id] = [] } # If `hash[id]` isn't yet set when
                                            # we try to access it, automatically
                                            # initialize it with an empty array
parsed_lines.each do |id, model|
  hash[id] << model
end

答案 1 :(得分:0)

我猜你没有任何数据库。如果您拥有的只是一个二维数组并且您想将其转换为哈希值,那么这就是您应该做的事情

model_array= [["001", "Model A"], ["001", "Model B"], ["001", "Model C"], ["002", "Model A"], ["002", "Model B"], ["002", "Model D"]]

hash = {}
model_arrays.each do |arr|
  hash[arr[0]] ||= []
  hash[arr[0]] << arr[1]
end

答案 2 :(得分:0)

这个班轮怎么样(没有声明parsed_lines

parsed_lines = [
    ["001",  "Model A"],
    ["001",  "Model B"],
    ["001",  "Model C"],
    ["002",  "Model A"],
    ["002",  "Model B"],
    ["002",  "Model D"]
]
Hash[parsed_lines.group_by(&:first).map{|k,v| [k.to_sym,v.map(&:last)]}]
#=> {:"001"=>["Model A", "Model B", "Model C"], :"002"=>["Model A", "Model B", "Model D"]}

但最好是做@ArupRakshit所说的并使用group_by查询并跳过这个额外的处理步骤。