如何根据给定的字符顺序对字符串进行排序?

时间:2015-02-17 19:05:21

标签: ruby string sorting

我正在尝试解决此问题:给定一个字符串,系统会要求您根据其他字符串中的字符顺序对其进行排序:

示例:

> 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 `'

3 个答案:

答案 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"