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