2012-11-29 51 views
0

我有問題排序數組升序,然後從數組中挑選一個值放入一個新的數組。紅寶石 - 排序數組值,然後選擇新陣列

# Splitting dance scores with "," and putting into arrays. 
for dancers in results 
    a = dancers.split(",") 

    couplenumber = a[0] 
    score1 = a[1] 
    score2 = a[2] 
    score3 = a[3] 
    score4 = a[4] 
    score5 = a[5] 
    score6 = a[6] 
    score7 = a[7] 
    dancescores << Dancer.new(couplenumber, score1, score2, score3, score4, score5, score6, score7) 
    # Sorts the array into ascending order, and shows the 4 lowest values. 
    #p dancescores.sort.take(4) 

    # Getting the m value, from picking the 4th lowest number. 
    m = a[4] 
    newtest = [couplenumber, m] 
    coupleandscore << newtest 
    coupleandscore 
end 
puts coupleandscore 

現在它給我的原始值的新陣中,這是它應該。但如果我嘗試做

p dancescores.sort.take(4) 

我會得到這個錯誤:

[#<Dancer:0x10604a388 @score7=5, @score3=3, @score6=6, @score2=2, @score5=1, @score1=1,  @couplenumber="34", @score4=3>] 
examtest.rb:43:in `sort': undefined method `<=>' for #<Dancer:0x10604a388> (NoMethodError) 

任何形式的幫助將不勝感激!

+0

你的得分是不完全清楚;你能解釋得更好嗎? '<=>'錯誤是因爲您尚未定義'<=>'方法。查看['Comparable'](http://www.ruby-doc.org/core-1.9.3/Comparable.html)模塊和['Enumerable.sort']的文檔(http:// ruby​​-doc .ORG /芯1.9.3/Enumerable.html#方法-I-排序)。 –

+0

基本上每對夫婦得分在1-6之間,1是最好的。他們從7名裁判那裏得到一個分數。他們可能會得到這樣的分數(1,4,2,6,6,5,3)。所以我想排序它,所以我按照這樣的升序排列(1,2,3,4,5,6,6),然後選擇第四個值(在這個例子中是數字4),然後比較每個舞者(找到贏家,這是第四個數字中價值最低的那個) – johk

回答

2

你應該更多地解釋正是你想做的事。

從我的理解:

class Dancer 

    attr_reader :number 
    attr_reader :scores 

    def initialize(number,scores) 
    @number=number 
    @scores=scores.sort 
    end 
end 

dancescores=[] 

results.each do |result| 
    scores = result.split(',') 
    couplenumber = scores.shift 
    dancescores << Dancer.new(couplenumber, scores) 
end 

# Now you can get the 4th score for each couple 
dancescores.each do |dancers| 
    p dancers.scores[3] 
end 
+0

我從我加載的文件中得到結果,我已經命名了一個'results = File.open(「danceresult.txt」,「r +」)'所以當我運行代碼時,我得到這個錯誤:'aa.rb:17:undefined method''score'for#(NoMethodError) \t from aa.rb: 16:在'each'' – johk

+0

我忘了添加attr_reader來訪問Dancer類中的數字和分數。現在應該可以。你仍然需要用chomp和strip來清理你的輸入以擺脫EOF和前導空間 –

+0

它的工作,非常感謝! :-) – johk

0

您可以在炫舞實施<=>像這樣

class Dancer 
    def sum_scores 
    @score1 + @score2 + @score3 + @score4 + @score5 + @score6 + @score7 
    end 
    def <=> other_dancer 
    sum_scores <=> other_dancer.sum_scores 
    end 
end 

我假設的得分只是加起來共展宏圖。

更新:評分是基於第4個值按排序分數

class Dancer 
    def scores 
    [@score1,@score2,@score3,@score4,@score5,@score6,@score7] 
    end 
    def <=> other_dancer 
    scores.sort[3] <=> other_dancer.scores.sort[3] 
    end 
end 

現在在你的代碼執行以下操作:

for dancers in results 
    a = dancers.split(",") 

    couplenumber = a[0] 
    score1 = a[1] 
    score2 = a[2] 
    score3 = a[3] 
    score4 = a[4] 
    score5 = a[5] 
    score6 = a[6] 
    score7 = a[7] 
    dancescores << Dancer.new(couplenumber, score1, score2, score3, score4, score5, score6, score7) 
end 
puts dancescores.sort.map{|d| [d.couplenumber,d.scores.sort[3]]} 
+0

其實我需要比較我從每個舞者獲得的價值。它必須是第四低的,這就是爲什麼我試圖按升序排序,然後選擇第四個值。 – johk

+0

所以你的意思是四個最低的分數或四個最低的舞者? – krichard

+0

每位舞者將獲得7分。可以說舞者得到(1,3,6,1,5,5,3)我想要排序,所以它(1,1,3,3,5,5,6),然後選擇第4價值,在這種情況下,數字3.或者有更簡單的方法來做到這一點? – johk