【问题标题】:How to format strings in an array in ruby?如何在ruby中格式化数组中的字符串?
【发布时间】:2015-03-15 20:48:24
【问题描述】:

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

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

此时每个字符串都已格式化:

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

我需要编写代码来格式化它:

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

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

【问题讨论】:

    标签: ruby arrays string sorting


    【解决方案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"
    # ]
    

    【讨论】:

      【解决方案2】:

      虽然为了美化代码,可能需要引入一些启发式数据重映射,但我会坚持使用简单的硬编码重新排序:

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

      希望对你有帮助。

      【讨论】:

        【解决方案3】:

        另一种方式:

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

        【讨论】:

          【解决方案4】:

          我会考虑将逻辑拆分成更小的部分并引入其他简单的对象,而不是仅仅尝试坚持使用 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 对象可以处理

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-24
            • 1970-01-01
            相关资源
            最近更新 更多