.join数组后的第一个单词前的空格到字符串

时间:2019-06-24 02:15:21

标签: ruby

要将数组转换为字符串,我使用了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 个答案:

答案 0 :(得分:5)

看到额外空间的原因是因为ruby中的数组被索引为0,所以您拥有nil数组元素,因为您的第一个插入是索引1

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

这样创建一个数组:

[
  nil,
  "test"
]

如果您创建了一个名为x的空数组并分配了x[10] = "test",则您将有10个nil值,并且数组中的单词“ test”。

因此,在加入之前,您的数组实际上是:

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

您有两种选择:

  • 更改字符串以零开头
  • 更改分配以调整偏移量(减一)
  • 在加入之前使用compact(这将删除nil)
  • 按照您所说的使用strip

我建议使用compact,因为它可以解决一些边缘情况(例如您的数字中的“空白”)。

array docs

中的更多信息

答案 1 :(得分:0)

@Jay's explanation确实是正确的。

我只是建议您使用一个更干净的代码,而不会出现相同的问题。


这假设1-9的顺序不是动态的。例如,如果您想按随机字符排序,则Aka无效。

def order(words)
  words.split.sort_by { |word| word[/\d/].to_i }.join ' '
end