Ruby 如何按照字符串x在字符串y中的显示顺序对字符串x进行排序?

Ruby 如何按照字符串x在字符串y中的显示顺序对字符串x进行排序?,ruby,Ruby,我正在尝试创建一个方法sort\u by\u letter,它接受两个字符串参数,并按照第一个字母在第二个字符串中出现的顺序对第一个字母进行排序 x = "cat" y = "kndttayc" sort_by_letter(x, y) #=> "tac" 试试这个 x.each_char.sort_by { |str| y.index str }.join 试试这个 x.each_char.sort_by { |str| y.index str }.join Subush

我正在尝试创建一个方法
sort\u by\u letter
,它接受两个字符串参数,并按照第一个字母在第二个字符串中出现的顺序对第一个字母进行排序

x = "cat"
y = "kndttayc"

sort_by_letter(x, y) 
  #=> "tac" 
试试这个

x.each_char.sort_by { |str| y.index str }.join
试试这个

x.each_char.sort_by { |str| y.index str }.join

Subush的答案很简单,效果也很好,但是如果字符串变长,并且您想关心效率,那么您可能还想这样做:

h = y.each_char.with_index.to_h
#=> {"k"=>0, "n"=>1, "d"=>2, "t"=>4, "a"=>5, "y"=>6, "c"=>7}
x.each_char.sort_by{|c| h[c]}.join
#=> "tac"

注:参见Simple Lime对问题的评论。在对这一点的不同解释下,Subush的答案和我的答案分别是正确的。

Subush的答案简单明了,效果很好,但是如果字符串变长,并且您想关心效率,您可能还想这样做:

h = y.each_char.with_index.to_h
#=> {"k"=>0, "n"=>1, "d"=>2, "t"=>4, "a"=>5, "y"=>6, "c"=>7}
x.each_char.sort_by{|c| h[c]}.join
#=> "tac"

注:参见Simple Lime对问题的评论。在对这一点的不同解释下,苏布什的答案和我的答案分别是正确的。

啊,这非常有效!我是通过在每个字符串上创建调用.char并对它们进行迭代来创建变量的,然后……比您的要优雅得多;)您可以省略
'
参数以
加入
x.each_char.sort_by{| str | y.index str}.join
ah工作得很好!我是通过在每个字符串上创建调用.char并对它们进行迭代来创建变量的,然后……比您的要优雅得多;)您可以省略
'
参数以
加入
x.each_char.sort_by{str | y.index str}.join
因为您的示例在
y
中显示了重复的字母,但在
x
中没有重复的字母:如果您通过
sort_by_letter('dcaaeb','abcade')
您会期望
'abcade'
'aabcde'
,或者
'bcaade'
?如果字母根本不在
y
中,会发生什么情况?这是放在末尾还是开头?例如,
x=“猫”;按字母排序(x,y)
将是
“tacs”
“stac”
?因为您的示例在
y
中显示重复的字母,但在
x
:如果您通过
按字母排序('dcaaeb','abcade')
,您会期望
'abcade'
'aabcde'
,或者
'bcaade'
?如果字母根本不在
y
中,会发生什么情况?这是放在末尾还是开头?例如,
x=“猫”;按字母(x,y)排序
将是
“tacs”
“stac”
?此解决方案有一个小问题:最后一个索引获胜,而您显然希望第一个索引获胜。使用_index
@mudasobwa“显然你想第一个赢”——将输入字符串颠倒过来,并将
zip
改为
length.downto(1)
,这是从哪里来的?请参阅答案中的最后一句。
y=“tatc”
应返回
“tac”
,否?[好吧,也许我错了,如果不是的话,
y.split(“”).uniq.join
比压缩到反向范围要好。@mudasobwa OP没有明确说明是返回
“tac”
还是
“atc”
@mudasobwa在这种情况下
y.chars.&x.chars)。join
这个解决方案有一个小问题:最后一个索引获胜,而你显然想第一个赢。使用_index
@mudasobwa“显然你想第一个赢”——将输入字符串颠倒过来,并将
zip
改为
length.downto(1)
,这是从哪里来的?请参阅答案中的最后一句。
y=“tatc”
应返回
“tac”
,否?[好吧,也许我错了,如果不是的话,
y.split('').uniq.join
比压缩到反向范围要好。@mudasobwa OP还没有明确说明它是否应该返回
“tac”
“atc”
@mudasobwa在这种情况下
y.chars.&x.chars.join