-1
@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?
4

5 に答える 5

3

上記の「配列」にタイプミスがあると仮定すると、単純な方法で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"]] 
于 2012-10-25T22:47:27.893 に答える
1

あなたが試すかもしれません:

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

有効ではありません。私の解決策は、単一項目配列の配列を返していません

于 2012-10-25T22:48:26.403 に答える
1
@arr1, @arr2 = @main.transpose.map{|a| a.map{|x| [x]}}
于 2012-10-25T22:49:44.987 に答える
0

簡単なアプローチは、次の 2 つのmap操作を行うことです。

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

しかし、@mainが大きい場合、配列を 2 回トラバースするため、これは悪い考えです。その場合:

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

transposeワンライナーでできる

@arr1, @arr2 = @main.transpose
于 2012-10-25T22:49:31.817 に答える
-1

メソッドを使用したものかもしれません#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]]
于 2012-10-25T22:49:41.673 に答える