2015-01-17 75 views
-1

我有我需要按照一定的順序來格式化字符串數組,數組是每個字符串如何在ruby中格式化數組中的字符串?

array = [ 
[0] "Bonk Radek S Male Green 6/3/1978", 
[1] "Bouillon Francis G Male Blue 6/3/1975", 
[2] "Smith Steve D Male Red 3/3/1985" 
] 

此刻索引每個字符串格式如下:

姓,名字,中間,性別,最愛的顏色,出生日期

我需要編寫代碼,將其格式化:

姓氏,名字,中間,性別,出生日期,最喜歡的顏色

如何重新排列字符串以使其符合我想要的格式並返回數組?

回答

1

使用正則表達式替換(String#sub):

array = [ 
    "Bonk Radek S Male Green 6/3/1978", 
    "Bouillon Francis G Male Blue 6/3/1975", 
    "Smith Steve D Male Red 3/3/1985" 
] 
array.map { |s| s.sub(/(\S+)(\s+)(\S+)$/, '\3\2\1') } 
# => [ 
#  "Bonk Radek S Male 6/3/1978 Green", 
#  "Bouillon Francis G Male 6/3/1975 Blue", 
#  "Smith Steve D Male 3/3/1985 Red" 
# ] 
0

雖然美化代碼人們可能要爲大家介紹的數據重新映射了一些啓發,我會堅持用簡單的硬編碼重新排序:

array = [ 
    "Bonk Radek S Male Green 6/3/1978", 
    "Bouillon Francis G Male Blue 6/3/1975", 
    "Smith Steve D Male Red 3/3/1985" 
] 
array.map { |p| 
    data = p.split(/\s+/); 
    [data[0],data[1],data[2],data[3],data[5],data[4]].join(', ') 
} 

#=> [ 
# [0] "Bonk, Radek, S, Male, 6/3/1978, Green", 
# [1] "Bouillon, Francis, G, Male, 6/3/1975, Blue", 
# [2] "Smith, Steve, D, Male, 3/3/1985, Red" 
#] 

希望它能幫助。

0

另一種方式:

a = array.map(&:split).transpose 
a[-1], a[-2] = a[-2], a[-1] 
a.transpose.map { |v| v.join(' ') } 
    #=> ["Bonk Radek S Male 6/3/1978 Green", 
    # "Bouillon Francis G Male 6/3/1975 Blue", 
    # "Smith Steve D Male 3/3/1985 Red"] 
0

我會考慮出分裂的邏輯成小塊,並引入其他簡單的對象,而不是隻是想堅持to Ruby String

require 'ostruct' 

Person = Struct.new(:surname, :forename, :initial, :gender, :colour, :date_of_birth) 

array = [ 
"Bonk Radek S Male Green 6/3/1978", 
"Bouillon Francis G Male Blue 6/3/1975", 
"Smith Steve D Male Red 3/3/1985" 
].map { |o| Person.new(*o.split(/\s+/)) } 

array.each do |person| 
    puts "%{surname} %{forename} %{initial} %{gender} %{date_of_birth} %{colour}" % person.to_h 
end 
  • 我首先創建一個代表一個人的基本類,這樣每行就會有一個實例。
  • 接下來,我每一行映射到這些人的一個對象
  • 然後我創建一個格式字符串,並拋出一個人的to_h進去

打破這種下降與真實的物體爲您提供了更大的靈活性長期來看,如果你想在日期排序,你需要將這些日期字符串解析成真實的物體,而你的Person對象可以處理該問題

相關問題