views:

210

answers:

1

I have code that sorts the way I want. By multiple fields. Cool. But now I realized that sometimes the elements could be nil.

Q1: Any idea how to manage to get nil values at the top of the search? And get rid of this error message :in "<=>": undefined method "<=>" for nil:NilClass (NoMethodError)

Q2: in the code below I sort by 3 elements can I somehow define to sort asc by e[2], decs by e[0] and asc by e[1]. I am sorting csv file and most of the fields will be text fields.

array_of_arrays = [[1,9,'a'],[2,2,'a'], [2,6,''], [1,3,'a'], [2,1,'']] #doesnt work
array_of_arrays = [[1,9,'a'],[2,2,'a'], [2,6,'b'], [1,3,'a'], [2,1,'b']] # works
array_of_arrays.each {|line| p line }
puts
array_of_arrays.sort_by {|e| [e[2], e[0], e[1]]} .each {|line| p line }
+3  A: 

I think you can put e[2].to_s in sort_by. Or if it still generating error, try this:

e[2].nil? ? '' : e[2]

or

e[2].nil? ? ' ' : e[2]

or

e[2].blank? ? ' ' : e[2]

Some of those shoud work ;)

Q2: if column is numeric, than you can add - sign before that column, so:

 array_of_arrays.sort_by {|e| [e[2].to_s, -e[0], e[1]]} .each {|line| p line }
klew
@klew: it looks so easy when one knows what he is doing... Thank you. e[2].to_s works smoothly
Radek
I added second answer. However I don't know how to inverse order of strings and other objects.
klew