我正在尝试解决此问题:给定一个字符串,系统会要求您根据其他字符串中的字符顺序对其进行排序:
示例:
> sort_string('foos', 'of')
=> 'oofs'
> sort_string('string', 'gnirts')
=> 'gnirts'
> sort_string('banana', 'abn')
=> 'aaabnn'
我尝试过以下实施:
def sort_string(f_string, s_string)
sanitize(s_string)
s_string.chars.each do |e|
f_string.length.times do |n|
if f_string[n] == e
s_string[e], s_string[n] = s_string[n], s_string[e]
end
end
end
end
private
def sanitize(string)
string.chars.uniq.join
end
但它给了我以下错误:
4_AStringOfSorts.rb:6:in `[]=': no implicit conversion of nil into String (TypeError) from 4_AStringOfSorts.rb:6:in `block (2 levels) in sort_string' from 4_AStringOfSorts.rb:4:in `times' from 4_AStringOfSorts.rb:4:in `block in sort_string' from 4_AStringOfSorts.rb:3:in `each' from 4_AStringOfSorts.rb:3:in `sort_string' from 4_AStringOfSorts.rb:18:in `'
答案 0 :(得分:4)
注意:
你的方法在Ruby中并不是惯用的(即使是强制性的标准,它也过于复杂)
sanitize(s_string)
:您无法捕获此方法的结果,因此无法执行任何操作。
更具惯用性和功能性的方法:
def sort_string(s, order)
s.chars.sort_by { |c| order.index(c) || order.size }.join
end
答案 1 :(得分:2)
类似的方法:
def sort_string(s, order)
order.chars.map { |c| c * s.count(c) }.join
end
答案 2 :(得分:0)
如果@ tokland对问题的解释是正确的,那么也可以这样做,而无需排序本身:
def sort_string(s, order)
sa = s.chars
order.each_char.with_object('') do |c,str|
while (idx = sa.index(c))
str << sa.delete_at(idx)
end
end + sa.join
end
sort_string('zaefcf', 'fa')
#=>"ffazec"
这是使用sort_by
的另一种方式,但仅限于需要排序的字符串部分:
def sort_string(s, order)
sa = s.chars
e = sa - order.chars
(sa - e).sort_by { |c| order.index(c) }.concat(e).join
end
sort_string('zaefcf', 'fa')
#=> "ffazec"