Ruby:使用基于第一个元素的第一个字母的键将二维数组转换为有序哈希

时间:2013-01-28 16:56:44

标签: ruby

假设我有以下二维数组(未排序)

[["Abigail", 1047], ["Betty", 1049], ["Alfred", 1048], ["Bernadette", 1050]]

如何根据第一个元素的第一个字母将其转换为具有字母键的哈希值?密钥需要根据它们的第一个元素(即本例中的人名)对数组元素进行排序:

{
'A' => [['Abigail','1047'], ['Alfred','1048']],
'B' => [['Bernadette','1050'], ['Betty','1049']]
}

3 个答案:

答案 0 :(得分:4)

a = [["Abigail", 1047], ["Betty", 1049], ["Alfred", 1048], ["Bernadette", 1050]]
p Hash[a.sort.chunk{|x| x[0][0]}.to_a]

适用于1.9.x

答案 1 :(得分:3)

a = [["Abigail", 1047], ["Betty", 1049], ["Alfred", 1048], ["Bernadette", 1050]]
p a.sort.group_by{|el| el.first[0]}

sort数组,以确保哈希中的键被排序(在1.9中),group_by第一个元素的第一个字母(名称)。

答案 2 :(得分:1)

names_and_values = [["Abigail", 1047], ["Betty", 1049], ["Alfred", 1048], ["Bernadette", 1050]]
#=> [["Abigail", 1047], ["Betty", 1049], ["Alfred", 1048], ["Bernadette", 1050]]
names_and_values.sort.reduce({}) do |memo, name_and_value|
  name = name_and_value[0]
  initial = name[0]
  ( memo[initial] ||= [] ) << name_and_value
  memo
end
#=> {"A"=>[["Abigail", 1047], ["Alfred", 1048]], "B"=>[["Bernadette", 1050], ["Betty", 1049]]}
相关问题