2012-04-30 51 views
0

采样输入的字符串:“车辆转向架8个4总线6 1”排序含有字符串和整数,使得字符串是按字母顺序排列和所有整数是数值,以便

示例输出:“总线轿厢1 4卡车6 8"

如果字符串中的第n个元素是一个整数它必须保持一个整数, ,如果它是一个字也必须保持一个字

是否有这样做的更优雅和有效的方式?以下是我的红宝石代码。我正在寻找更有效的代码(不必在红宝石中)。

puts "Enter Input:" 
inp = gets 

inp_ary=inp.split(" ") 

a=inp_ary.group_by{|i| i=~ /\d/} 

sort_words = a[nil].sort 
sort_integer = a[0].sort 

index_words=[] 
index_integer=[] 

inp_ary.each_with_index do |e,i| 
    if e =~ /\d/ 
    index_integer << i 
    else 
    index_words << i 
    end 
end 

final = [] 

sorted = sort_words + sort_integer 

index_integer.each_with_index do |e,i| 
    final[e] = sort_integer[i] 
end 

index_words.each_with_index do |e,i| 
    final[e] = sort_words[i] 
end 

puts "Sorted Output: " 
puts final.join(" ") 
+0

为什么C++标签? – CyprUS

+2

因为C++是最高效的语言吗? :-)更有趣的是为什么卡车是在4和6之间。 –

+0

整数对于单词有什么立场?即为什么是4辆车之后但卡车之前? –

回答

4
s = "car truck 8 4 bus 6 1" 

tokens = s.split 
numbers, words = tokens.partition{|t| t =~ /^\d+$/} 
numbers.map!(&:to_i).sort! 
words.sort! 

result = tokens.map{|t| (t =~ /^\d+$/ ? numbers : words).shift}.join(' ') 

p result 
#=> "bus car 1 4 truck 6 8" 
相关问题