Arrays 用Ruby中的数组制作二维数组

Arrays 用Ruby中的数组制作二维数组,arrays,ruby,Arrays,Ruby,这可能是noob提出的问题,但我无法做到 我有一个数组 arr = ["I", "wish", "I", "hadn't", "come"] 我需要做 [["I", "wish I hadn't come"], ["I wish", "I hadn't come"], ["I wish I", "hadn't come"], ["I wish I hadn't", "come"]] 我了解如何划分该阵列: Array.new(n) { Array[arr.shift(n).join(

这可能是noob提出的问题,但我无法做到

我有一个数组

arr = ["I", "wish", "I", "hadn't", "come"]
我需要做

[["I", "wish I hadn't come"], 
 ["I wish", "I hadn't come"],
 ["I wish I", "hadn't come"],
 ["I wish I hadn't", "come"]]
我了解如何划分该阵列:

Array.new(n) { Array[arr.shift(n).join(" "), arr.join(" ")] }
但我认为,n必须从1变为arr.size-1,才能用所需的数组填充二维数组。
我不明白该怎么做。

这应该适合你:

arr = ["I", "wish", "I", "hadn't", "come"]

new_arr = (0..arr.size-2).map {|i| [arr[0..i].join(" "), arr[i+1..-1].join(" ")] }

p new_arr
哪些产出:

[
  ["I", "wish I hadn't come"], 
  ["I wish", "I hadn't come"], 
  ["I wish I", "hadn't come"], 
  ["I wish I hadn't", "come"]
]

这应该适合您:

arr = ["I", "wish", "I", "hadn't", "come"]

new_arr = (0..arr.size-2).map {|i| [arr[0..i].join(" "), arr[i+1..-1].join(" ")] }

p new_arr
哪些产出:

[
  ["I", "wish I hadn't come"], 
  ["I wish", "I hadn't come"], 
  ["I wish I", "hadn't come"], 
  ["I wish I hadn't", "come"]
]
Arrayshift具有破坏性,它会改变您的阵列:

arr = ["I", "wish", "I", "hadn't", "come"]

[arr.shift(2).join(" "), arr.join(" ")]
#=> ["I wish", "I hadn't come"]

arr
#=> ["I", "hadn't", "come"]
您可以改为使用:

-1表示最后一个元素。

数组移位是破坏性的,它会改变数组:

arr = ["I", "wish", "I", "hadn't", "come"]

[arr.shift(2).join(" "), arr.join(" ")]
#=> ["I wish", "I hadn't come"]

arr
#=> ["I", "hadn't", "come"]
您可以改为使用:


-1是指最后一个元素。

您可能想考虑使用,它可以返回数组的选择部分,而不是可以为第一个n个元素实现相同的东西,但是在这样做时修改了原来的数组。将这一点与从1号循环到1号的想法结合起来,将有助于实现目标。我在1…n做语法是这样做的一种方式。

你可能想考虑使用,它可以返回数组中的一个选择部分,而不是可以为第一个N个元素实现相同的东西,但是在这样做的时候修改了原来的数组。将这一点与从1号循环到1号的想法结合起来,将有助于实现目标。for i in 1..n do语法是一种方法。

这里有一种方法:

require "pp"

arr = ["I", "wish", "I", "hadn't", "come"]

r = (1...arr.size).collect  {|i| [arr.take(i).join(" "), arr.drop(i).join(" ")]}

pp r
#=> [["I", "wish I hadn't come"],
#   ["I wish", "I hadn't come"],
#   ["I wish I", "hadn't come"],
#   ["I wish I hadn't", "come"]]

有一种方法可以做到这一点:

require "pp"

arr = ["I", "wish", "I", "hadn't", "come"]

r = (1...arr.size).collect  {|i| [arr.take(i).join(" "), arr.drop(i).join(" ")]}

pp r
#=> [["I", "wish I hadn't come"],
#   ["I wish", "I hadn't come"],
#   ["I wish I", "hadn't come"],
#   ["I wish I hadn't", "come"]]

使用map而不是each/pushYup。您还可以使用map来干燥连接:arr.size.pred.times.map{i}[arr[0..i],arr[i+1..-1]].map{a | a.join'}@Pholochtairze谢谢。我终于明白了这个机制。我整个星期都在发疯…@Stefan:我试过地图版,你是这么想的吗?我现在很好奇,几乎你不需要el,所以我会写1..arr.size.map{I | I |…}使用map而不是each/pushYup。您还可以使用map来干燥连接:arr.size.pred.times.map{i}[arr[0..i],arr[i+1..-1]].map{a | a.join'}@Pholochtairze谢谢。我终于明白了这个机制。我整个星期都在发疯…@Stefan:我试过地图版,你是这么想的吗?我现在很好奇,几乎,你不需要el,所以我会写1..arr.size.map{I | I |…},因为循环现在很少使用。很好。我认为1..n-1语法会有所帮助,因为OP似乎理解他想要使用的开始和结束索引,但这将是一个很好的机会来研究Ruby还可以提供什么,例如,或者对于这种情况,正如您所建议的。我对循环有了想法,也许我找到了正确的决定,但我忘了endfor循环中需要的新数组现在很少使用。这一点很好。我认为1..n-1语法会有所帮助,因为OP似乎理解他想要使用的开始和结束索引,但这将是一个很好的机会来研究Ruby还可以提供什么,例如,或者对于这种情况,正如您所建议的。我对循环有了想法,也许我找到了正确的决定,但我忘记了在end@Stefan谢谢我明白了,我弄错了新阵列。@Stefan谢谢。我明白了,我弄错了新阵列。