连接数组项

时间:2010-03-31 13:41:12

标签: ruby

我有两个数组:

x = [ ["0", "#0"], ["1", "#1"] ]
y = [ ["00", "00 description"], ["10", "10 description"] ]

我需要的是合并它们,以便得到以下结果:

result = [ ["000", "#0 00 description"], ["010", "#0 10 description"],
   ["100", "#1 00 description"], ["110", "#1 10 description"] ]

有没有办法呢?或者我需要使用collect或类似的东西?

提前致谢。

3 个答案:

答案 0 :(得分:2)

在您的示例中,您似乎应用特殊规则来连接整数的特定十进制表示的数字,这不能以任何简单的方式工作(例如,当您编写00时,它只是0到翻译)。但是,假设简单的字符串连接是你的意思:

x = [ ["0", "#0"], ["1", "#1"] ]
y = [ ["00", "00 description"], ["10", "10 description"] ]
z = []
x.each do |a|
  y.each do |b|
    c = []
    a.each_index { |i| c[i] = a[i] + b[i] }
    z << c
  end
end
p z

编辑:最初发布的问题版本将整数作为每个子数组的第一个元素,解决方案的前言指的是那个。此后,该问题已被编辑为具有此处假定的字符串。

答案 1 :(得分:1)

您可以使用Array#product方法:

x = [ ['0', "#0"], ['1', "#1"] ]
#=> [["0", "#0"], ["1", "#1"]]
y = [ ['00', "00 description"], ['10', "10 description"] ]
#=> [["00", "00 description"], ["10", "10 description"]]
x.product(y).map{|a1,a2| [a1[0]+a2[0], a1[1] + ' ' + a2[1]]}
#=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]]

如果您不需要上面的不同类型的连接(第二个插入空间),甚至:

x.product(y).map{|a1,a2|
  a1.zip(a2).map{|e|
    e.inject(&:+)
  }
}

这是一个没有Array#product的变体,无形的可读性:

x.inject([]){|a,xe|
  a + y.map{|ye|
    xe.zip(ye).map{|e|
      e.inject(&:+)
    }
  }
}

答案 2 :(得分:1)

在您的示例中,您将连接第一个不带空格的元素,但第二个元素连接空格。如果你能以同样的方式做到这一点,那就可以了:

x.product(y).map {|a,b| a.zip(b).map(&:join)}
=> [["000", "#000 description"], ["010", "#010 description"], ["100", "#100 description"], ["110", "#110 description"]]

如果需要不同的连接,请执行以下操作:

x.product(y).map {|a,b| [a[0]+b[0],a[1]+' '+b[1]]}
=> [["000", "#0 00 description"], ["010", "#0 10 description"], ["100", "#1 00 description"], ["110", "#1 10 description"]]