2012-12-04 24 views
0

摘要:我試圖找出一種很好的方法來存儲,排序和平均從文件讀取後分組到對象中的相關數據。我有兩個相關的問題:覆蓋<=>和equ?在Ruby中使用不同的設置

1)可以接受的做法是覆蓋<=>以便按不同的順序對對象進行排序,同時覆蓋equ?表示它們相等嗎?

2)有沒有一種方法來檢查散列has_key?其中has_key?讀取多個參數來執行和檢查散列?

詳細

我讀大量從一個文本文件中的數據,我想要做的操作就可以了,我對它進行排序,並排除最高值和最低值,並計算平均值。爲了使這個問題更具體的我輸入集包含字符串,如:

field1 field2 field3 value1 value2

(注意:這是比較複雜的,但我已經得到了解析工作已經提取這些值)。

最初我已經創建了一個類,如:

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

我也重新定義了比較操作<=>,使其第一排序上field1然後field2終於field3。這允許我打印出所有按照我想要的順序排序的數據。

但是現在我想要做的就是在所有字段相同時將不同的值平均在一起。我還希望能夠對條目進行排序,並在進行平均之前刪除最高和最低值。那就是我希望能夠將field1field2field3相同的條目分組。然後按value1排序這些分組條目,刪除最高和最低的條目,然後將剩餘結果平均到一起。

我想到的一個想法是擴展類定義以包含存儲value1value2的數組。然後,我會將對象插入散列表中,並在存在散列的情況下向對象添加新值。但我不知道如何或者如果我可以使用多個字符串來檢查散列是否有特定的鍵。

我以爲我可以覆蓋hashequ?運營商,以便與field1field2field3相同值的對象將返回相同的位置。我不確定的一件事是,說明對象與equ?相等是好主意,但要讓它們按<=>以不同順序排序。

或者也許在Ruby中有一種更簡單的方法來解決我正在處理的問題,並且我想到的解決方案比需要的更復雜。

+0

我還沒有讀完整個問題,但看起來你想創建一個比較器。你有沒有檢出Ruby [可比較的mixin模塊,鏈接到這裏](http://www.ruby-doc.org/core-1.9.3/Comparable.html)? –

+0

您是否考慮過將數據扔到數據庫中並讓它完成繁重的工作?即使SQLite也會吃這個東西。 –

+0

我已經使用過可比較的mixin。我需要弄清楚的是,如何與哈希交互?或者,也許這並不重要,這是我想知道的一部分。 –

回答

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 

其餘的不太確定。