0

概要: ファイルから読み取った後、オブジェクトにグループ化する関連データを保存、並べ替え、平均化するための良い方法を見つけようとしています。関連する質問が 2 つあります。

<=>1)オブジェクトを異なる順序でソートするためにオーバーライドequ?すると同時に、それらが等しいと言うためにオーバーライドすることは許容される慣行ですか?

2)ハッシュを実行およびチェックするために複数の引数を読み取るhas_key?場所でハッシュをチェックする方法はありますか?has_key?

詳細

テキスト ファイルから大量のデータを読み込んでおり、並べ替えを行い、最高値と最低値を除外して平均を計算したいと考えています。この質問をより具体的にするために、私の入力セットは次のような文字列で構成されています。

field1 field2 field3 value1 value2

(より複雑ですが、これらの値を抽出するための解析が既に行われていることに注意してください)。

最初に、次のようなクラスを作成しました。

class data
  def initialize
    @field1
    @field2
    @field3
    @value1
    @value2
  end
end

また、比較演算子を再定義して、<=>最初にfield1thenで並べ替えfield2、finallyで並べ替えるようにしましたfield3。これにより、必要な順序で並べ替えられたすべてのデータを印刷できます。

しかし、今私がやりたいことは、すべてのフィールドが同じ場合に異なる値を平均化することです。また、平均化を行う前に、エントリを並べ替えて最高値と最低値を削除できるようにしたいと考えています。field1 field2つまり、とfield3が同じエントリをグループ化できるようにしたいのです。次に、グループ化されたエントリを並べ替えてvalue1、最高のエントリと最低のエントリを削除し、残りの結果を平均します。

私が思いついたアイデアの 1 つは、クラス定義を拡張して、 と を格納する配列を含めることvalue1ですvalue2。次に、オブジェクトをハッシュ テーブルに挿入し、ハッシュが存在する場合はオブジェクトに新しい値を追加します。しかし、ハッシュに特定のキーがあるかどうかを確認するために複数の文字列を使用できるかどうか、またはどのように使用できるかはわかりません。

andの値が同じオブジェクトが同じ場所にハッシュされるように、 hashandequ?演算子をオーバーライドできると仮定します。私が確信していないことの 1 つは、オブジェクトが と等しいと言うのが良い考えであるかどうかです。field1 field2field3equ?<=>

あるいは、私が取り組んでいる問題を解決するためのより簡単な方法が Ruby にあるのに、私が考えた解決策が必要以上に複雑なのかもしれません。

4

1 に答える 1

1
#define: Hash#has_keys?
class Hash
    def has_keys? *args
        args.all?{|k| self.keys.include? k } unless self.keys.empty?
        # returns true if hash has all keys
        # returns false otherwise
        # returns nil if the hash is empty?
    end
end

残りについてはよくわかりません。

于 2012-12-09T12:09:09.480 に答える