Пробел перед первым словом после массива .join в строку - PullRequest
1 голос
/ 24 июня 2019

Для преобразования массива в строку я использовал Array#join и получил пробел между началом строки, первой кавычкой и первым словом.Я не понимаю, почему это происходит.

Я решил с помощью String#strip, но я хотел бы понять,

def order(words)
  arr_new = []
  arr = words.split(" ")
  nums = ["1","2","3","4","5","6","7","8","9"]
  arr.each do |word|
    nums.each do |num| 
      if word.include? num 
        arr_new[num.to_i] = word
      end 
    end
  end 

  arr_new.join(" ").strip 
end 


order("is2 Thi1s T4est 3a")

Без .strip вывод:

" Thi1s is2 3a T4est"

После .strip:

"Thi1s is2 3a T4est"

Ответы [ 2 ]

5 голосов
/ 24 июня 2019

Причина, по которой вы видите дополнительное пространство, в том, что массивы в ruby ​​проиндексированы 0, поэтому у вас есть элемент массива nil, потому что ваша первая вставка - это индекс 1

x = []
x[1] = "test"

Это создает массив следующим образом:

[
  nil,
  "test"
]

Если вы создали пустой массив с именем x и присвоили x[10] = "test", у вас было бы 10 нулевых значений и слово "test" в вашем массиве.

Итак, ваш массив перед объединением на самом деле:

[nil, "Thi1s", "is2", "3a", "T4est"]

У вас есть пара вариантов:

  • Измените ваши строки, чтобы начать с нуля
  • Измените свое назначение, чтобы скорректировать смещение (вычесть одно)
  • Используйте compact перед тем, как присоединиться (это удалит nils)
  • Используйте strip, как вы заметили

Я бы предложил compact, потому что это решило бы несколько крайних случаев (таких как "пробелы" в ваших числах.

Дополнительная информация в массиве документов

0 голосов
/ 24 июня 2019

@ Объяснение Джея действительно верно.

Я просто предложу более чистую версию вашего кода, в которой нет такой же проблемы.


Предполагается, что порядок 1-9 не является динамическим. Ака не сработает, если вы хотите отсортировать по случайным символам, например.

def order(words)
  words.split.sort_by { |word| word[/\d/].to_i }.join ' '
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...