我有键值对的未排序映射。
input = {
"xa" => "xavalue",
"ab" => "abvalue",
"aa" => "aavalue",
"ba" => "bavalue",
}现在,我想按键对它们进行排序,并按键的第一个字符将它们分组。与此类似:
output1 = {
"a" => {
"aa" => "aavalue",
"ab" => "abvalue",
},
"b" => {
"ba" => "bavalue",
},
"x" => {
"xa" => "xavalue",
},
},
,
的简洁的ruby代码。
。
output2 = [
{
"name" => "a",
"keys" => [ "aa", "ab" ],
"values" => [ "aavalue", "abvalue" ],
},
{
"name" => "b",
"keys" => [ "ba" ],
"values" => [ "bavalue" ],
},
{
"name" => "x",
"keys" => [ "xa" ],
"values" => [ "xavalue" ],
}
]发布于 2008-12-16 14:10:34
据我所知,Ruby中并没有排序散列/映射的概念,因此您只能使用好的旧数组。您可能希望从以下代码开始:
output = input.inject({}) { |acc, pair|
letter = pair.first[0].chr
acc[letter] ||= {}
acc[letter][pair.first] = pair.last
acc
}.sort这将为您提供表单中的数据结构。
[ ["a", {"aa"=>"aavalue",
"ab"=>"abvalue"}],
["b", {"ba"=>"bavalue"}],
["x", {"xa"=>"xavalue"}]]通过将组件数组映射为散列..。
output.map {|pair| {pair.first => pair.last}}你可以把它转换成
[{"a"=>{"aa"=>"aavalue",
"ab"=>"abvalue"}},
{"b"=>{"ba"=>"bavalue"}},
{"x"=>{"xa"=>"xavalue"}}]使用类似的地图,您可以找到列出的最后一个表单(output2):
output2 = output.map { |pair|
hash = pair.last
{ 'name' => pair.first,
'keys' => hash.keys,
'values' => hash.values }
}https://stackoverflow.com/questions/371064
复制相似问题