Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 对字符串整数标识符数组排序(如“chapter3lesson11”)_Ruby_Sorting - Fatal编程技术网

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+/ }