2014-06-25 125 views
-2

我有標準,其中百分比值。按百分比標準分配學生

criteria = {"Top" => 20, "Excellent" => 30, "Average" => 30, "Poor" => 20 

我有學生哈希。鍵是學生ID和數值是學生分數

students = { 1 => 80, 
      2 => 90, 
      3 => 30, 
      4 => 50, 
      5 => 120, 
      6 => 90, 
      7 => 50, 
      8 => 50, 
      9 => 50, 
      10 => 30} 

Crietria是由老師添加。學生名額按這種方式計算,因爲我不能得到例如2.5的學生:

students_positions = criteria.map {|k, v| (students.count * (v.to_f/100)).ceil } 
f=> [2, 3, 3, 2] 

我首先要做的就是通過自己的價值排序的學生(成績)

sorted_students = students.sort {|a1,a2| a2.last <=> a1.last }.to_h 
=> {5=>120, 2=>90, 6=>90, 1=>80, 8=>50, 4=>50, 7=>50, 9=>50, 3=>30, 10=>30} 

結果應該是20%( 2名學生職位)的學生散列獲得'最高'標準,30%(3個學生職位)獲得'優秀'等。如果兩名學生具有相同得分但被放置在不同標準組中,則應該都屬於之前的標準組。例如,One是90分的Top,另外一個是90分的Execellent,第二個必須移到Top crietria集團。

我怎樣才能通過標準拆分學生

此致 的Georgi

+0

'學生'沒有'*'方法。目前還不清楚你在做什麼。 – sawa

+0

@sawa對不起,我忘了改變它。其students.count – Georgi

回答

1

修改該給定表達式(其中第一個是不是一個紅寶石表達)到Ruby表達式:

criteria = {"Top" => 20, "Excellent" => 30, "Average" => 30, "Poor" => 20} 
students = { 
    1 => 80, 
    2 => 90, 
    3 => 30, 
    4 => 50, 
    5 => 120, 
    6 => 90, 
    7 => 50, 
    8 => 50, 
    9 => 50, 
    10 => 30 
} 

將值轉換爲有用的值:

n = 0 
accumulated_counts = 
criteria 
.each_with_object({}){|(k, v), h| h[k] = n += students.length * v/100.0} 

# => 
# { 
# "Top"  => 2.0, 
# "Excellent" => 5.0, 
# "Average" => 8.0, 
# "Poor"  => 10.0 
# } 

students_by_score = 
students.group_by(&:last).sort.reverse.map{|a| a.last.map(&:first)} 

# => [[5], [2, 6], [1], [4, 7, 8, 9], [3, 10]] 

派發學生:

n = 0 
accumulated_counts 
.each_with_object(Hash.new{|h, k| h[k] = []}) do |(k, v), h| 
    h[k].push(*students_by_score.shift) while n + h[k].length < v 
    n += h[k].length 
end 

# => 
# { 
# "Top"  => [5, 2, 6], 
# "Excellent" => [1, 4, 7, 8, 9], 
# "Average" => [], 
# "Poor"  => [3, 10] 
# } 
+0

非常感謝。 Yuor回答幫助我。只是在分析貧困學生需要在Avarage中移動的情況。例如3個地方如此貧窮應該是空的。我將根據您的代碼修復此問題。再一次非常感謝你 – Georgi