你怎么能循环多个数组并行?

时间:2009-10-21 02:45:57

标签: ruby

我有4个阵列。

["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

不可预测的数组&它们各自不等大小

4 个答案:

答案 0 :(得分:5)

易:

a = [array1,array2,array3,array4] # or however many you have

puts a.transpose.map {|x| x.join(", ")}.join("\n")

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

如果子阵列的长度不同,但是可以使用第一个长度,你可以这样做:

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

答案 1 :(得分:4)

如果你知道它们的长度相同,那就好了:

(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]}

Edit2:如果您不知道会有多少阵列会发生什么?

我建议制作一个数组数组;数组列表。创建一个数组数组(本质上是一个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"
}

答案 2 :(得分:3)

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

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

编辑:不,zip对于追加数组而言不会很有帮助。 Array#join方法对此有好处。你可以附加到zip ped数组的末尾,但这并不容易:

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

答案 3 :(得分:1)

如果你使用的是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