Ruby on rails 通过另一个字符串数组对字符串进行自定义排序-Ruby

Ruby on rails 通过另一个字符串数组对字符串进行自定义排序-Ruby,ruby-on-rails,arrays,ruby,string,sorting,Ruby On Rails,Arrays,Ruby,String,Sorting,我有一个数组,目前按字母顺序排序,我正试图按字符串的手动顺序进行排序 当前代码: list = ["gold","silver","bronze","steel","copper"] list = list.sort { |a, b| a <=> b } 产量:铜、银、金、铜、钢 这可能吗?当前遇到以下错误消息: comparison of Integer with nil failed comparison of String with String failed 您可能只需

我有一个数组,目前按字母顺序排序,我正试图按字符串的手动顺序进行排序

当前代码:

list = ["gold","silver","bronze","steel","copper"]

list = list.sort { |a, b| a <=> b }
产量:铜、银、金、铜、钢

这可能吗?当前遇到以下错误消息:

comparison of Integer with nil failed
comparison of String with String failed

您可能只需要创建一个奖牌等级或类似的等级,使用数字等级和字符串名称,然后根据等级进行排序。像这样

class Medal
  attr_accessor :name, :rank

  def initialize(name, rank)
    @name = name
    @rank = rank
  end
end

list = [Medal.new("gold", 0), Medal.new("silver", 1), Medal.new("bronze", 2), Medal.new("steel", 4), Medal.new("copper", 3)]

list = list.sort_by &:rank
如果你想的话,你可以更进一步,定义一个奖牌名到等级的映射,从初始化中删除等级。如果你愿意的话,你也可以把每个奖牌定义为一个常量,因为你可能只有一个固定的列表

但若你们不想这样做,那个么你们也可以有一个按索引排序的顺序列表,就像这样

list = ["gold","silver","bronze","steel","copper"]

sort_order = ["bronze","silver","gold","","copper","steel"]

list = list.sort_by {|m| sort_order.index m}

您可能只需要创建一个奖牌等级或类似的等级,使用数字等级和字符串名称,然后根据等级进行排序。像这样

class Medal
  attr_accessor :name, :rank

  def initialize(name, rank)
    @name = name
    @rank = rank
  end
end

list = [Medal.new("gold", 0), Medal.new("silver", 1), Medal.new("bronze", 2), Medal.new("steel", 4), Medal.new("copper", 3)]

list = list.sort_by &:rank
如果你想的话,你可以更进一步,定义一个奖牌名到等级的映射,从初始化中删除等级。如果你愿意的话,你也可以把每个奖牌定义为一个常量,因为你可能只有一个固定的列表

但若你们不想这样做,那个么你们也可以有一个按索引排序的顺序列表,就像这样

list = ["gold","silver","bronze","steel","copper"]

sort_order = ["bronze","silver","gold","","copper","steel"]

list = list.sort_by {|m| sort_order.index m}
我假设:

  • 列表
    的每个元素都是按
    排序的
  • 排序顺序
    可能包含不在
    列表中的元素
  • 列表
    可能包含重复项;及
  • 排序顺序
    不包含重复项
如果
sort\u order
最初包含重复项,则临时数组
sort\u order.uniq
可用于计算

请注意,如果如示例中所示,
list
不包含重复项,并且
sort\u order
不包含除
list
中的元素以外的其他元素,则按照
sort\u order
中的元素顺序对
list
进行排序很简单,因为它只返回
sort\u order

以下方法比使用
sort
sort\u by
的方法更有效(
O(n)
O(n*log(n)
)计算复杂度比较。)

我假设:

  • 列表
    的每个元素都是按
    排序的
  • 排序顺序
    可能包含不在
    列表中的元素
  • 列表
    可能包含重复项;及
  • 排序顺序
    不包含重复项
如果
sort\u order
最初包含重复项,则临时数组
sort\u order.uniq
可用于计算

请注意,如果如示例中所示,
list
不包含重复项,并且
sort\u order
不包含除
list
中的元素以外的其他元素,则按照
sort\u order
中的元素顺序对
list
进行排序很简单,因为它只返回
sort\u order

以下方法比使用
sort
sort\u by
的方法更有效(
O(n)
O(n*log(n)
)计算复杂度比较。)


sort\u order.每个带有索引的\u.to\u h
?一次生成
count
表。但这会生成
=>{“青铜”=>0,“银”=>1,“金”=>2,“铜”=>3,“钢”=>4}
。我需要
{“gold”=>2,“copper”=>2,“silver”=>1,“steel”=>1}
。我想你比我更了解这个问题,因为这个问题本身对我来说没有意义。
排序。每个都有索引。一次生成
count
表。但这会生成
{brown”=>0,“silver”=>1,“gold”=>2,“copper”=>3,“钢”=>4}
。我需要
{“金”=>2,“铜”=>2,“银”=>1,“钢”=>1}
。我想你比我更了解这个问题,因为这个问题本身对我来说没有意义。