2016-09-03 3 views
0

配列のリストが与えられたら、すべて配列の組み合わせを2の配列の形で表示したいとします。たとえば、配列が[1,2,3]であるとします。ルビを入れ子にして配列を表示する方法は?

[1, 1] 
[1, 2] 
[1, 3] 
[2, 1] 
[2, 2] 
[2, 3] 
[3, 1] 
[3, 2] 
[3, 3] 

期待される結果

これは私が思い付いた機能である:私は上記のコードを実行するとき

def all_combination(list) 
    list.each do |i| 
    list.each do |j| 
     puts [i,j] 
    end 
    end 
end 

arr1 = [1,2,3] #arr1 can be an array of any size. It will always be integer. 
all_combination(arr1) 

しかし、それは

1 
1 
1 
2 
1 
3 
... 

を表示すること私の根本的なルビー知識にはギャップがあるようです。 なぜputs [i,j]は動作しませんか? のように実際の配列を表示させるにはどうすればいいですか?期待結果セクション?

私はそれがputs "#{i}, #{j}"で動作させることができますが、それは、配列のペアあなたが望むのための組み込み方法があります[a,b]

答えて

1

を返しません:

[1,2,3].permutation(2).each {|a| p a} 

独自の方法に固執することを好む場合(アイテムの「ペア」を得るには)puts [i,j]p [i,j]またはputs [i,j].to_sputsのいずれかに変更します。

+0

Gotcha!私はputsが文字列でしか動作しないことを認識しませんでした。私は私のファンダメンタルズが欠けている!どうもありがとうございました :) – Iggy

0

それぞれの新しい行でデータを取得するのは、putsが与えられた各オブジェクトを新しい行に書き込むためです。 Hereはこれに関する文書です。

IO#printと同様に、指定されたオブジェクトをiosに書き込みます。レコード セパレータ(通常は改行)を、改行シーケンスである で終了していないものの後に書き込みます。配列引数を指定して呼び出された場合、新しい行にそれぞれ 要素を書き込みます。引数なしで呼び出された場合は、単一の レコードセパレータを出力します。

もしあなたがそれが行く方法であることをArray#permutationがしているとすれば、私はそれがあなたが要求したものと一致するとは思わない(すなわち、[1,1]、[2,2]、[ 3,3]は含まれません)。

以下は、最初に求めていたものを提供するものです。

def all_combination(list) 
    a = [] 
    list.each do |i| 
    list.each do |j| 
     a << [i,j] 
    end 
    end 
    a 
end 

x = all_combination [1,2,3] 
p x 
puts x 

=> [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] 
1 
1 
1 
2 
1 
3 
2 
1 
2 
2 
2 
3 
3 
1 
3 
2 
3 
3 

xはあなたがX

PS pで示すように探していた返された値である:これはおそらくラインで行うか、あまりにも少ないアレイ#を使用することができ減らすが、これは前方かなり海峡です。

0

私の基本的なルビー知識にはギャップがあるようです。 なぜputs [i,j]は動作しませんか?

なぜ我々だけでドキュメントを見ていませんか?

The documentation for Kernel#putsは単にIO#putsのマニュアルをご参照:

puts(obj, …)nil

$stdout.puts(obj, …) 

The documentation for IO#putsと同等本(大胆強調鉱山)言います:

puts(obj, …)nil

IO#printと同様IOSに与えられたオブジェクトを書き込みます。改行シーケンスで終わっていないレコードセパレータ(通常は改行)を書き込みます。 配列引数で呼び出された場合、各要素を新しい行に書き込みます。引数なしで呼び出された場合は、単一のレコードセパレータを出力します。

あなたが見ることができるように、ドキュメントは明確にあなたがputsArrayを渡すとき、それは別の行に各要素を出力しますと述べています。

は、どのように私はそれが期待される結果セクションに示しように、それは実際の配列を表示することができますか?

あなたは「実際の配列」を表示することはできません。配列は、インデックスをオブジェクトにマップするデータ構造です。それはアイデアです。アイデアを表示することはできません。テキストは表示することができます(String)。したがって、希望の出力のように見えるStringを構築する必要があります。

私はそれがputs "#{i}, #{j}"で動作させることができますが、それはあなたが括弧を印刷し、それを言わなかったので、まあ、それはブラケットを印刷しない列対[a,b]

を返しません。 Stringは単に印刷されますが、Stringには角括弧はありません。出力に角括弧は付きません。あなたはそれらを追加する必要があります。

puts "[#{i}, #{j}]" 

注:あなたはArray#inspectArray#to_s、またはKernel#pを使用するように誘惑が、しないでくださいすることができる。その出力形式は保証されませんです。あなたはあなたが期待しているものを手に入れることができますが、もう一度、そうすることはできません。

#inspectは、人間が読めるデバッグ出力用です。 Kernel#pは単に#inspectを呼び出します。Array#to_sの特定の場合には、それは単にArray#inspectの別名で、ドキュメントは言う:

inspectstring

to_sstring

selfの文字列表現を作成します。それが唯一の「文字列表現」と言うが、それは返し文字列表現を保証するものではないことを

[ "a", "b", "c" ].to_s  #=> "[\"a\", \"b\", \"c\"]" 

注意。すでにRubyのコアライブラリで提供さ

  • 使用上位レベルのコレクション操作:私は主に二つのことをやった

    def all_combination(list) 
        list.product(list).map {|a, b| "[#{a}, #{b}]" } 
    end 
    
    arr1 = [1,2,3] 
    puts all_combination(arr1) 
    

    Iがあなたの問題にアプローチような方法は、このようなものです(Array#productおよびEnumerable#map)。これにより、ソリューションを理解する上でのコグニティブなオーバーヘッドが削減されます。これは、現在、リストのデカルト積を最初に生成し、次に各ペアを適切な文字列表現に変換することを明確に示す単なる1行です。

  • 出力の印刷とは別の構成で出力を印刷します。これは簡単にテストすることができます。単に値を返すだけで、スクリーンに直接印刷するのではなく、フープをジャンプしてスクリーン出力をキャプチャして、あらかじめ記録されたスクリーン出力などと比較するだけですそれ。

改善するものとはいえ、まだあります

  • は、方法は2つのことを行います:デカルト積を生成し、文字列表現
  • メソッドの命名に変換:これは実際に#をほのめかします上記の1:メソッドが複数のことを一度に行う場合、メソッドが何を正確に記述する適切な名前を見つけることができますか?
関連する問題