2016-05-17 5 views
0

テーブルの検証アルゴリズムを実装しようとしていますが、配列やハッシュを扱うためにRubyが提供する複数の選択肢と混同しています。一例として、この表を考えてみましょう:テーブル内のセルの組み合わせを確認する

| A | B | C | 
------------- 
| 1 | 2 | 3 | 
| 1 | 2 | 4 | 
| 5 | 6 | 7 | 
| 1 | 1 | 3 | 

私の方法は、特定の細胞の組み合わせの出現回数をカウントする必要があります。例えば、この組み合わせは、最初の行と最後の両方に存在するように

match_line([A => 1, C => 3]) 

結果は、2なければなりません。

[A => 0, B => 1, C=> 2] 

そして、私もそうのような上記のすべてのテーブルの行を保持する配列のリストがあります:

[[1, 2, 3], [1, 2, 4], [5, 6, 7], [1, 1, 3]] 

を私はこれまでのところのように、列のインデックスを保持hash変数を作成することです何をしたか その論理は、上記のmatch_lineメソッドのように、ユーザーが列Aに1という値を持ち、列Cに3という値がある行と一致させたいという特定の方法です。インデックスハッシュに基づいて、A列インデックスは0であり、Cインデックスは2です。配列リスト内の各配列(行)に対して、インデックス0がに等しく、インデックス2がユーザが要求したように3に等しい場合、カウンタに+1を追加し、終了するまで他の配列行を継続します。

私はそれをコードに形成しようとしましたが、非常に効率的ではないと思われる方法で終了しました。あなたのコード例を見ることに興味があります。おそらくRubyは内側のEnumerableメソッドを持っていますよりエレガントにするために

答えて

2

まず、あなたのドメインを記述するために利用可能な最善の構造を使用する必要があります。

data = [[1, 2, 3], [1, 2, 4], [5, 6, 7], [1, 1, 3]] 

@data_hashes = data.map do |sequence| 
    { 'A' => sequence[0], 'B' => sequence[1], 'C' => sequence[2] } 
end 

第二に、私はあなたがmatch_lineの入力として本当のハッシュを使うべきだと思う:

# replace match_line([A => 1, C => 3]) with 
match_line({'A' => 1, 'C' => 3}) 

今、あなたを」 Enumerable#selectArray#size(またはArray#countをKeith Bennetが指して使用)

01を使用して簡単に実装できます
def match_line(match) 
    @data_hashes.count { |row| 
    match.all? { |match_key, match_value| 
     row[match_key] == match_value 
    } 
    } 
end 

EDIT:が動的にこれは私その後、実装がより容易になります確かにあるカラム名

columns = ['a', 'b', 'c'] 
data = [[1, 2, 3], [1, 2, 4], [5, 6, 7], [1, 1, 3]] 

@data_hashes = data.map do |row| 
    Hash[columns.zip(row)] 
end 
+0

からハッシュを作成します。データ構造が複雑すぎると言われたように、私のエラーはだと思います。上記の例では、私の列は定数である必要がありますか?テーブルの列が動的に選択されている場合、これは機能しませんか?私は列の名前を保持し、何とかそれに対してシーケンスを動的に構築する別の配列を持つ必要がありますね?ありがとう! – Okiba

+0

メソッドは小さく、責任の分離の一種を尊重する必要があります:マッチングを管理するメソッドを定義し、入力からハッシュを構築するメソッドを定義します。これにより、保守や再利用が容易になります。 – floum

+0

すでに完了しています。 '@ data_hashes'にキー値を動的に割り当てる方法がわかりません。これはおそらく何か? 'column_names = ['d'、 'e'、 'f'] @data_hashes = data。マップド|シーケンス| column_names.each_with_index do | value、index | {value => sequence [index]} end' – Okiba

関連する問題