如何在Ruby中使用数组方法将字符串数组转换为带有牛津逗号的列表

4sup72z8  于 2023-05-17  发布在  Ruby
关注(0)|答案(4)|浏览(166)

这是一个家庭作业的问题,所以我试图通过它尽可能多的工作之前,我可以来这里寻求帮助。我已经解决了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 ==)
bksxznpy

bksxznpy1#

当数组中只有一个元素时,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
m528fe3b

m528fe3b2#

最大评论:
你可以这样做:

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,然后用逗号连接所有内容。使用阵列的副本是非破坏性的。

2w2cym1i

2w2cym1i3#

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

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 []
  #=> ""
lo8azlld

lo8azlld4#

如果你使用的Ruby版本支持Pattern Matching(我相信2.7是实验版本,3.0是官方版本),你可以这样做:

def oxford_comma(array)
  case array
  in [word]
    word
  in [word_1, word_2]
    "#{word_1} and #{word_2}"
  in [*words, last_word]
    "#{words.join(', ')}, and #{last_word}"
  end
end

如果需要处理一个空数组,也可以添加一个in [] case。您可能还希望在末尾添加一个else case,以防传入一些意外的内容。

相关问题