Arrays 用Ruby中的数组制作二维数组
这可能是noob提出的问题,但我无法做到 我有一个数组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(
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谢谢。我明白了,我弄错了新阵列。