Как превратить массив строк в список с оксфордской запятой, используя методы массива в Ruby - PullRequest
0 голосов
/ 09 июня 2019

Это из-за проблемы с домашним заданием, поэтому я постарался пройти через это столько, сколько мог, прежде чем прийти сюда за помощью.У меня это решено на 95%, я просто не могу понять синтаксис последнего бита или какой метод мне следует использовать, если он отличается от того, что я делаю сейчас.Я не могу найти никакого решения для этого онлайн, которое на самом деле не является ответом моих одноклассников, и я избегаю нажимать на них, чтобы посмотреть, как они закончили проблему.

Я могу вернуть строку без форматирования, если онаимеет только один элемент, только со словом «и», когда есть два элемента, и я могу добавить запятые и слово «и», когда имеется более трех элементов.Однако я не могу пропустить добавление последней запятой, когда массив содержит более трех элементов.

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 ==)

Ответы [ 3 ]

1 голос
/ 10 июня 2019

Если у вас есть только один элемент в массиве, Array # join возвращает сам элемент:

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

Таким образом, вы можете упростить код, добавив "and " к последнему элементу, если размер списка равен 3 или более, или верните .join(' and '), если менее 3 элементов:

def oxford_comma(list)
  return list.join(' and ') if list.size < 3
  list[-1] = "and " + list[-1]
  list.join(', ')
end
0 голосов
/ 10 июня 2019

Для удобства чтения я предлагаю простое решение.

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 []
  #=> "" 
0 голосов
/ 09 июня 2019

РЕДАКТИРОВАТЬ с максимальным количеством комментариев:

Вы можете сделать это:

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, а затем соединяете все запятыми. Используйте копию массива, чтобы быть неразрушающим.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...