【问题标题】:Sorting a string by last names: Ruby按姓氏对字符串进行排序:Ruby
【发布时间】:2021-01-04 10:16:49
【问题描述】:

发现这个编码挑战相当棘手,似乎无法弄清楚我应该添加什么方法来明确排序字符串的姓氏。

当前解决方案:

def sort_reindeer reindeer_names
  return sorted_names = reindeer_names.sort_by do |name|
    name.split(" ").reverse.join
  end
end 

结果:

# issue: Expected: ["Kenjiro Mori", "Susumu Mori", "Akira Mori"]
# => instead got: ["Akira Mori", "Kenjiro Mori", "Susumu Mori"]

看起来我的代码已经看到每个姓氏都是匹配的,并决定映射名字并按字母顺序返回它们。如果姓氏匹配,如何阻止我的代码订购名字?你会建议我创建某种三元语句还是有更简单的解决方法。

【问题讨论】:

  • 导致测试失败的输入是什么?如果姓氏相同,确定排序顺序的规则是什么?排序需要稳定吗?

标签: arrays ruby string algorithm sorting


【解决方案1】:

首先,对于技术细节,您不需要显式的return 或设置sorted_names 局部变量。

Ad rem:不用name.split(' ').reverse.join,它也按第一个单词排序(如果最后一个单词相等),你可以这样做:name.split(' ').last,所以它只考虑最后一个单词。结果是:

def sort_reindeer(reinder_names)
  reinder_names.sort_by { |name| name.split(' ').last }
end

sort_reindeer(["Kenjiro Mori", "Susumu Mori", "Akira Mori"])
# => ["Kenjiro Mori", "Susumu Mori", "Akira Mori"] 

【讨论】:

  • 这适用于一些,但不是所有的 Ruby 实现,因为 sort_by 不能保证是稳定的。见:stackoverflow.com/q/15442298/967621
  • ...一个变种:reindeer_names.sort_by { |name| name[/[^ ]+\A/] }.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2015-07-08
  • 2010-10-26
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多