从一个 Ruby 哈希表中排序值,忽略大小写。

3
这是我在 Ruby 哈希中处理值以获得字母数字小写排序输出的方法(极端示例):
myhash = {
  "x" => "zebra",
  "one" => "1",
  "alpeh" => "alpha",
  "lower" => "january",
  "1" => "January",
  "2" => "February",
  "answer" => "42"
}
m = myhash.values
puts m.map{|i| i.downcase}.sort

输出:

1
42
alpha
february
january
january
zebra

这个方法很好用,我没有问题,但是想知道是否有更简单/更有效的方法我可能不知道?

3个回答

7

既然您想修改值(输出小写字符串),我认为您不能做得更好。

如果只要原始值排序良好就可以输出,您可以使用以下内容:

 myhash.values.sort_by{|h|h.downcase}

编辑:感谢Casper,这里有一个更紧凑的版本:

myhash.values.sort_by(&:downcase)

编辑:感谢Mischa,如果你想保留你提供的输出:

myhash.values.map(&:downcase).sort

1
你可以使用 sort_by(&:downcase) 来使它更加紧凑。 - Casper
同样地,原始代码可以缩短为:myhash.values.map(&:downcase).sort - Mischa
啊,选择了您的答案进行改进(因为它有效且更紧凑),但是最后两个版本会抛出错误:TypeError: wrong argument type Symbol (expected Proc)。 - Dave Everitt

3
比使用 hash.values 更有效的方法(因为它会创建一个临时数组,如果哈希表很大,可能会占用大量时间和空间)
myhash.sort_by{|_,v| v.downcase}

1
@daververitt 但是如果你使用 hash.values,你会分割哈希表,并创建一个可能很长的数组。 - SwiftMango

1

这可能更有效率...

m.sort {|a, b| a.casecmp(b)}

=> ["1", "42", "alpha", "February", "January", "january", "zebra"]

只需使用一个测试函数,忽略输入的大小写即可。这取决于您是否希望输出数组具有重复值(例如 january/january vs January/january)。


谢谢 - 它几乎完成了工作,但仍需要中间的 m 数组,而且 casecmp 显然不会将值转换为小写。 - Dave Everitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接