如何在多个数组之间并行循环?

我有4个arrays。

["one", "two", "three"] ["1", "2", "3" ["un", "deux", "trois"] ["ichi", "ni", "san"] 

是否可以在各自的数组中连接每个元素?

所以我最终会得到像单行一样的字符串

 "one, 1, un, ichi"\n "two,2, deux,ni"\n 

等等…

是否可以在一个循环中执行此操作?

 for i in (1..array1.count) puts array1[i] + ", " + array2[i] + ", " + array3[i] + ", " + array4[i] end 

当可能存在不可预测的数组并且它们各自的大小不相等时会发生什么?

好吧,如果你知道他们都是相同的长度:

 (0...array1.length).each{|i|puts array1[i] + ", " + array2[i] + ", " + array3[i] + ", " + array4[i]} 

编辑: 以下代码有效

 array1 = ["one", "two", "three"] array2 = ["1", "2", "3"] array3 = ["un", "deux", "trois"] array4 = ["ichi", "ni", "san"] (0...array1.length).each{|i| puts array1[i] + ", " + array2[i] + ", " + array3[i] + ", " + array4[i]} 

编辑2: 如果您不知道将有多少arrays会发生什么?

我建议制作一个数组数组; 数组列表。 创建一个数组数组(本质上是一个2D数组,但它不能像一个数组一样索引),并使用它为arrayList中的每个数组逐个打印每一行。

此代码有效:

 array1 = ["one", "two", "three"] array2 = ["1", "2", "3"] array3 = ["un", "deux", "trois"] array4 = ["ichi", "ni", "san"] arrayList = [] arrayList.push(array1, array2, array3, array4) p arrayList (0...array1.length).each{|i| (0...arrayList.length).each{|j| print arrayList[j][i] + ", " } print "\n" } 

简单:

 a = [array1,array2,array3,array4] # or however many you have puts a.transpose.map {|x| x.join(", ")}.join("\n") 

这将适用于任意数量的子arrays,只要它们具有相同的大小(无论大小是多少)。

如果子数组的长度不同,但可以使用第一个的长度,则可以这样做:

 a[0].zip(*a[1..-1]).map {|x| x.join(", ")}.join("\n") 

我会使用Enumerable#zip来创建一个数组数组。 它将创建一个数组,其中第一个元素是传递给它的所有数组的第一个元素的数组,依此类推第二个,第三个等等。然后浏览此列表并使用Array#join打印每个参数。 就像是:

 a.zip(b, c, d).each do |l| puts l.join(", ") end 

编辑:不,就附加数组而言, zip不会非常有用。 格伦的方法对此有好处。 你可以附加到zip ped数组的末尾,但这并不容易:

 e = a.zip(b, c) e.length.times { |i| e[i].push(d[i]) } 

如果你使用ruby 1.9,也许你可以利用外部迭代器,这将让你处理任意数量的数组:

 array1 = ['one','two','three'] array2 = [1,2,3,4] array3 = ['un','deux','trois'] array4 = ['ichi','ni','san'] def bundle(*enumerables) enumerators = enumerables.map{ |e| e.to_enum } loop { puts enumerators.map { |e| e.next }.join(', ') } end bundle(array1,array2,array3,array4) 

生产:

 one, 1, un, ichi two, 2, deux, ni three, 3, trois, san