如何在ruby中格式化数组中的字符串?

时间:2015-01-17 08:32:14

标签: ruby arrays string sorting

我有一个字符串数组,我需要按特定顺序格式化,数组如下,每个字符串的索引

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"
]

目前每个字符串都被格式化:

姓氏,名字,中间,性别,收视颜色,出生日期

我需要编写将其格式化的代码:

姓氏,名字,中间,性别,出生日期,喜欢的颜色

如何将字符串重新排列为我想要的格式并返回数组?

4 个答案:

答案 0 :(得分: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"
# ]

答案 1 :(得分: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"
#]

希望它有所帮助。

答案 2 :(得分: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"]

答案 3 :(得分:0)

我会考虑将逻辑拆分成更小的部分并引入其他简单的对象,而不是仅仅试图坚持使用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
  • 我首先创建一个代表一个人的基本类,这样每行就会有一个实例。
  • 接下来,我将每一行映射到其中一个Person对象
  • 然后我只创建一个格式字符串并将一个人的to_h投入其中

使用真实对象打破这一点可以让您在长期运行中获得更大的灵活性,就像您希望按日期排序一样,您需要将这些日期字符串解析为真实对象,而Person对象可以处理