"xavalue", "ab" => "abvalue", "aa" => "aavalue", "ba" => "bav-6ren">
gpt4 book ai didi

ruby - 从 map 构建分类部分

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:08 24 4
gpt4 key购买 nike

我有未排序的键值对映射。

input = {
"xa" => "xavalue",
"ab" => "abvalue",
"aa" => "aavalue",
"ba" => "bavalue",
}

现在我想按键对它们进行排序,并按键的第一个字符将它们分组。类似这样:

output1 = {
"a" => {
"aa" => "aavalue",
"ab" => "abvalue",
},
"b" => {
"ba" => "bavalue",
},
"x" => {
"xa" => "xavalue",
},
}
  1. 虽然这相对微不足道,但我正在寻找一种简洁的方式来表达 ruby​​ 中从输入到输出 1 的这种转换。 (对于 ruby 标准,我的方法可能过于冗长)

  2. 您可能还注意到 map (通常)是无序的。因此,除非我手动对键进行排序并包装对 map 的访问,否则上述数据结构将无法正常工作。那么我如何在 ruby​​ 中创建一个键有序映射呢?或者已经有了?

  3. 如果有序映射方法不是那么容易,我将不得不将最终结构更改为如下所示。我再次寻找一些简洁的 ruby​​ 代码来从输入到输出 2。

.

output2 = [
{
"name" => "a",
"keys" => [ "aa", "ab" ],
"values" => [ "aavalue", "abvalue" ],
},
{
"name" => "b",
"keys" => [ "ba" ],
"values" => [ "bavalue" ],
},
{
"name" => "x",
"keys" => [ "xa" ],
"values" => [ "xavalue" ],
}
]

最佳答案

据我所知,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"}}]

使用类似的 map ,您可以找到您列出的最后一个表格(output2):

output2 = output.map { |pair|
hash = pair.last
{ 'name' => pair.first,
'keys' => hash.keys,
'values' => hash.values }
}

关于ruby - 从 map 构建分类部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com