| Class | Array |
| In: |
lib/array.rb
|
| Parent: | Object |
[a, b, c, d].each_row_with_index.do |row, index|
puts("#{row}, #{index}")
end >> [ a, b ], 0 >> [ c, d ], 1
Used for races table on top of results page. May be a Rails method for this, but doesn‘t include index, I think. Then again, I don‘t think we use index any more, either.
# File lib/array.rb, line 12
12: def each_row_with_index
13: return [[], 0] if empty?
14: rows = []
15: row_count = (size + 1) / 2
16:
17: for row_index in 0..(row_count - 1)
18: row = [self[row_index]]
19: second_element_index = (row_count - 1) + row_index + 1
20: if second_element_index < size
21: row << self[second_element_index]
22: end
23: rows << row
24: yield row, row_index
25: end
26:
27: [ rows, row_index ]
28: end
# File lib/array.rb, line 66
66: def merge(left, right, &predicate)
67: sorted = []
68: until left.empty? or right.empty?
69: if predicate
70: if predicate.call(right.first, left.first)
71: sorted << left.shift
72: else
73: sorted << right.shift
74: end
75: else
76: if left.first <= right.first
77: sorted << left.shift
78: else
79: sorted << right.shift
80: end
81: end
82: end
83: sorted.concat(left).concat(right)
84: end
Sort is stable only if predicate includes an equal comparison. Example: x.name <= y.name
# File lib/array.rb, line 58
58: def merge_sort(&predicate)
59: return self.dup if size <= 1
60: mid = size / 2
61: left = self[0, mid].dup
62: right = self[mid, size].dup
63: merge(left.merge_sort(&predicate), right.merge_sort(&predicate), &predicate)
64: end
Sort by method and preserve existing order. Ruby 1.8 sort_by does not preserve order.
# File lib/array.rb, line 31
31: def stable_sort_by(method, order = :asc)
32: if order == :asc
33: merge_sort { |x, y|
34: if x.send(method).nil?
35: true
36: elsif !x.send(method).nil? && y.send(method).nil?
37: false
38: else
39: x.send(method) >= y.send(method)
40: end
41: }
42: elsif order == :desc
43: merge_sort { |x, y|
44: if y.send(method).nil?
45: true
46: elsif !y.send(method).nil? && x.send(method).nil?
47: false
48: else
49: x.send(method) <= y.send(method)
50: end
51: }
52: else
53: raise ArgumentError, "order must be :asc or :desc"
54: end
55: end