【问题标题】:How to turn an array of strings into a list with an oxford comma using array methods in Ruby如何使用Ruby中的数组方法将字符串数组转换为带有牛津逗号的列表
【发布时间】:2019-10-24 08:42:35
【问题描述】:

这是一个家庭作业问题,所以我在来这里寻求帮助之前尽可能多地解决它。我已经解决了 95%,我只是无法弄清楚最后一位的语法,或者如果它与我现在正在做的不同,我应该使用什么方法。我在网上找不到任何实际上不是我同学的答案的解决方案,我避免点击这些解决方案来查看他们是如何完成问题的。

如果它只有一个元素,我可以不格式化返回字符串,当有两个元素时只有单词'and',当元素超过三个时我可以添加逗号和单词'and'。但是,当数组的元素超过三个时,我似乎无法跳过添加最后一个逗号。

def oxford_comma(array)
    if array.length == 2
        array.join(" and ")
    elsif array.length > 2
        array.insert(-2, "and")
        array[0..-1].join(", ")
    else
        array.join
    end
end

这是我收到的错误消息:

         Failure/Error: expect(oxford_comma(["kiwi", "durian", "starfruit", "mangos", "dragon fruits"])).to eq("kiwi, durian, starfruit, mangos, and dragon fruits")

   expected: "kiwi, durian, starfruit, mangos, and dragon fruits"
        got: "kiwi, durian, starfruit, mangos, and, dragon fruits"

   (compared using ==)

【问题讨论】:

    标签: arrays ruby string


    【解决方案1】:

    当数组中只有一个元素时,Array#join 返回元素本身:

    ['a'].join(' and ') #=> "a"
    

    因此,当列表大小为 3 或更大时,您可以简化在最后一个元素前添加 "and " 的代码,或者如果少于 3 个元素,则返回 .join(' and '):

    def oxford_comma(list)
      return list.join(' and ') if list.size < 3
      list[-1] = "and " + list[-1]
      list.join(', ')
    end
    

    【讨论】:

    • 谢谢!这种方式对我来说很有意义。我不太确定这条线是如何工作的:list[-1] = "and " + list[-1] 但没关系!谢谢!
    • 为了回答你的问题,@AmandaTreutler,list[-1] 指的是最后一项。因此,代码将最后一项设置为"and " + last_item。在该行之后,最后一项变为:`and ITEM`。
    【解决方案2】:

    使用最大 cmets 进行编辑:

    你可以这样做:

    def oxford_comma(array)
      array = [*array]
      case array.size
      when 0
        ''
      when 1
        array[0].to_s
      when 2
        array.join(' and ')
      else
        array_copy = array
        array_copy[-1] = "and #{array_copy[-1]}"
        array_copy.join(', ')
      end
    end
    

    处理空数组、单值数组和双值数组的边缘情况的情况。 否则,您将最后一项更改为添加and,然后用逗号连接所有内容。 使用数组的副本是非破坏性的。

    【讨论】:

    • 这不是预期的输出,您在 OP 的帖子中看到它是 mangos, and dragon fruits。我认为您需要在长度 = 2 时进行特殊情况(只需通过“和”连接,不带逗号)并通过“,和”连接“其他”情况
    • 您可能要处理的其他边缘情况:1) 非数组参数,如 nil 或单个值,使用 array = [*array] 表示法 2) 非字符串数组,更改为 array[0],to_s in when 1 块
    • tx max,没注意到
    • 已更改为另一个版本。但是使用副本是没有用的,因为我还使用了已经创建副本的 array = [*array]。
    【解决方案3】:

    为了可读性,我建议一个简单的解决方案。

    def oxford_comma(arr)
      case arr.size
      when 0
        ""
      when 1
        arr.first
      when 2
        arr.join(' and ')
      else
        [arr[0..-2].join(', '), arr.last].join(', and ')
      end
    end
    

    oxford_comma ["blue", "green", "pink", "white"]
      #=> "blue, green, pink and white" 
    oxford_comma ["blue", "green"]
      #=> "blue and green" 
    oxford_comma ["blue"]
      #=> "blue" 
    oxford_comma []
      #=> "" 
    

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多