gpt4 book ai didi

ruby - 在 ruby​​ 中对哈希数组进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:44 25 4
gpt4 key购买 nike

我有一个哈希数组,如下所示:

ward = {id: id, name: record["Externalization"], mnemonic: record["Mnemonic"],
seqno: record["SeqNo"]}

所有字段都是字符串。

现在我想先根据 s​​eqno 对它们进行排序,然后再根据名称对它们进行排序。 seqno 可以是 nil(如果 seqno 是 nil,那么这个病房必须在有 seqno 的病房之后)。

我目前拥有的是:

wardList.sort! do |a,b| 
return (a[:name] <=> b[:name]) if (a[:seqno].nil? && b[:seqno].nil?)
return -1 if a[:seqno].nil?
return 1 if b[:seqno].nil?
(a[:seqno] <=> b[:seqno]).nonzero? ||
(a[:name] <=> b[:name])
end

但这给了我错误:无法将 Symbol 转换为 Integer

最佳答案

首先,规范化你的数据,你不能在这里使用整数作为字符串:

wardList = wardList.map { |x| x.merge({:id    => x[:id].to_i, 
:seqno => x[:seqno].try(:to_i) }) }

然后就可以使用sort_by,它支持字典排序:

wardList.sort_by! { |x| [x[:seqno] || Float::INFINITY, x[:name]] }

例子:

irb(main):034:0> a = [{:seqno=>5, :name=>"xsd"}, 
{:seqno=>nil, :name=>"foo"},
{:seqno=>nil, :name=>"bar"},
{:seqno=>1, :name=>"meh"}]
irb(main):033:0> a.sort_by { |x| [x[:seqno] || Float::INFINITY, x[:name]] }
=> [{:seqno=>1, :name=>"meh"},
{:seqno=>5, :name=>"xsd"},
{:seqno=>nil, :name=>"bar"},
{:seqno=>nil, :name=>"foo"}]

关于ruby - 在 ruby​​ 中对哈希数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9807637/

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