【问题标题】:Splitting an Array into firsts and lasts将数组拆分为第一个和最后一个
【发布时间】:2012-10-25 22:43:21
【问题描述】:
@main = connection.execute("select code_ver, comment from mastertest 

@main 包含类似这样的内容:

{ [2.1, abcd],
  [3.0, xyz],
  [2.0, pqr] }

我想将此数组拆分为 2 个数组,这样:

@arr1 = {[2.1],
         [3.0],
         [2.0]}

@arr2 = {[abcd],
         [xyz],
         [pqr]}

我这样做是为了从另一个数组中复制一个数组:

@arr1 = Array.new
@main.each { |r| @arr1.push(r[0]) }

Can something be done here itself to split it how I want it?

【问题讨论】:

  • 带有{...} 的不是数组。它们甚至不是有效的 Ruby 对象。
  • 您真的希望@arr1@arr2 成为单元素数组的数组吗?这似乎是一件奇怪的事情,而且用你的符号很难判断你是不是这个意思。

标签: ruby arrays multidimensional-array


【解决方案1】:

假设上面的“数组”中有一些错字,一个简单的map 就可以解决问题:

> @main = [[2.1, 'abcd'], [3.0, 'xyz'], [2.0, 'pqr']]
# => [[2.1, "abcd"], [3.0, "xyz"], [2.0, "pqr"]] 
> @arr1 = @main.map {|y|[y[0]]}
# => [[2.1], [3.0], [2.0]] 
> @arr2 = @main.map {|y|[y[1]]}
# => [["abcd"], ["xyz"], ["pqr"]] 

你也可以看看transpose

> @main.transpose
# => [[2.1, 3.0, 2.0], ["abcd", "xyz", "pqr"]] 

【讨论】:

  • 你的第二个答案没有给出预期的结果。
  • 明白。这就是我建议查看的原因。毕竟单元素数组的数组有点靠不住。
【解决方案2】:
@arr1, @arr2 = @main.transpose.map{|a| a.map{|x| [x]}}

【讨论】:

  • 为什么需要map?一个简单的transpose 还不够吗?
  • @AndyH 没有map,你会得到[2.1, 3.0, 2.0]等等。不是[[2.1], [3.0], [2.0]]
【解决方案3】:

你可以试试:

ar1 = Array.new
ar2 = Array.new
[ [2.1, abcd], [3.0, xyz], [2.0, pqr] ].each do |val| 
  ar1 << val[0]
  ar2 << val[1]
end

编辑:
如前所述:

{[2.1, abcd], [3.0, xyz], [2.0, pqr]}

无效,我的解决方案是不返回单项数组的数组

【讨论】:

  • -1。这给出了[2.1, 3.0, 2.0] 等而不是[[2.1], [3.0], [2.0]]
【解决方案4】:

简单的做法是做两个map操作:

@arr1 = @main.map(&:first)
@arr2 = @main.map(&:last)

但如果@main 很大,这是个坏主意,因为它会遍历数组两次。在这种情况下:

@arr1 = []
@arr2 = []
@main.each do |item|
  @arr1 << item.first
  @arr2 << item.last
end

transpose 可以一次性完成

@arr1, @arr2 = @main.transpose

【讨论】:

  • -1。这给出了[2.1, 3.0, 2.0] 等而不是[[2.1], [3.0], [2.0]]
【解决方案5】:

也许使用#transpose 方法:

main = [[2.1,'abcd'],[3.0,'xyz'],[2.0,'pqr']]
p main.transpose.first #=> [2.1, 3.0, 2.0]

或者,如果结果应该是单元素数组:

main = [[2.1,'abcd'],[3.0,'xyz'],[2.0,'pqr']]
p main.transpose.first.map { |e| [e] } #=> [[2.1], [3.0], [2.0]]

【讨论】:

  • -1。这给出了[2.1, 3.0, 2.0] 等而不是[[2.1], [3.0], [2.0]]
  • @sawa 从这个问题中很难判断这是否需要,因为提问者似乎不熟悉 ruby​​ 语法。我添加了一个生成单元素数组的示例,尽管现在其他答案已经很好地涵盖了它。
猜你喜欢
  • 2022-06-11
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多