Ruby 对字符串整数标识符数组排序(如“chapter3lesson11”)
我想对数组进行排序:Ruby 对字符串整数标识符数组排序(如“chapter3lesson11”),ruby,sorting,Ruby,Sorting,我想对数组进行排序: p1q1 p1q10 p1q2 根据本命令: p1q1 p1q2 p1q10 ie:通过增加pinteger,然后增加qinteger 我正在尝试使用ids.sort{| id | id.to_I}构造,但我可能正在重新发明轮子。。。执行此排序的最可读/最简单的方法是什么?我能想到的最简单的方法是: >> arr.sort_by { |id| id =~ /^p(\d+)q(\d+)$/ ; [$1.to_i, $2.to_i] } => ["p1q1
p1q1
p1q10
p1q2
根据本命令:
p1q1
p1q2
p1q10
ie:通过增加p
integer,然后增加q
integer
我正在尝试使用
ids.sort{| id | id.to_I}
构造,但我可能正在重新发明轮子。。。执行此排序的最可读/最简单的方法是什么?我能想到的最简单的方法是:
>> arr.sort_by { |id| id =~ /^p(\d+)q(\d+)$/ ; [$1.to_i, $2.to_i] }
=> ["p1q1", "p1q2", "p1q10"]
我想这样说:
def p_q_str_to_num(str)
str =~ /p(\d+)q(\d+)/
($1+$2).to_i
end
a = ["p1q1", "p1q10", "p1q2"]
a.sort {|x,y| p_q_str_to_num(x) <=> p_q_str_to_num(y)}
这应该适用于任意深度,而不仅仅是两个级别:
ids.sort_by { |id| id.scan /\d+/ }
添加
$1
和$2
会在p7q8
之前排序p8q6
,这不是OP想要的。好吧,Michael的排序方法确实比我的更优雅佩尔,这不正是他想要的吗?我把“先长p,然后长q”解释为他想在p7q8
之前有p8q6
。我把p
s上升到q
s,这意味着p7qx
在p8qx
之前。我们需要等待OP澄清。很抱歉造成混淆:p7qx
在p8qx
之前,但是它足够短,可以保存额外的方法调用(map
)和它将创建的额外数组。对于两个以上的变量,我会按照你的方式来做。
ids.sort_by { |id| id.scan /\d+/ }