 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Sorting an Array by Frequency of Appearance | ||
|---|---|---|
| Code | Expected | Actual | 
| module Enumerable
  def sort_by_frequency
    histogram = inject(Hash.new(0)) { |hash, x| hash[x] += 1; hash}
    sort_by { |x| [histogram[x], x] }
  end
end
[1,2,3,4,1,2,4,8,1,4,9,16].sort_by_frequency | [3, 8, 9, 16, 2, 2, 1, 1, 1, 4, 4, 4] | [3, 8, 9, 16, 2, 2, 1, 1, 1, 4, 4, 4] | 
| [1,2] <=> [0,2] | 1 | 1 | 
| [1,2] <=> [1,2] | 0 | 0 | 
| [1,2] <=> [2,2] | -1 | -1 | 
| [1,2] <=> [1,1] | 1 | 1 | 
| [1,2] <=> [1,3] | -1 | -1 | 
| [1,2] <=> [1] | 1 | 1 | 
| [1,2] <=> [3] | -1 | -1 | 
| [1,2] <=> [0,1,2] | 1 | 1 | 
| [1,2] <=> [] | 1 | 1 | 
| module Enumerable
  def sort_by_frequency_faster
    histogram = inject(Hash.new(0)) { |hash, x| hash[x] += 1; hash}
    sort_by { |x| histogram[x] }
  end
end
[1,2,3,4,1,2,4,8,1,4,9,16].sort_by_frequency_faster | [16, 8, 3, 9, 2, 2, 4, 1, 1, 4, 4, 1] | [16, 8, 3, 9, 2, 2, 4, 1, 1, 4, 4, 1] | 
| module Enumerable
  def sort_by_frequency_descending
    histogram = inject(Hash.new(0)) { |hash, x| hash[x] += 1; hash}
    sort_by { |x| [histogram[x] * -1, x]}
  end
end
[1,2,3,4,1,2,4,8,1,4,9,16].sort_by_frequency_descending | [1, 1, 1, 4, 4, 4, 2, 2, 3, 8, 9, 16] | [1, 1, 1, 4, 4, 4, 2, 2, 3, 8, 9, 16] | 
| module Enumerable
  def sort_distinct_by_frequency
    histogram = inject(Hash.new(0)) { |hash, x| hash[x] += 1; hash }
    histogram.keys.sort_by { |x| [histogram[x], x] }
  end
end
[1,2,3,4,1,2,4,8,1,4,9,16].sort_distinct_by_frequency | [3, 8, 9, 16, 2, 1, 4] | [3, 8, 9, 16, 2, 1, 4] |