Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check to see if an array is already sorted?

Tags:

I know how to put an array in order, but in this case I just want to see if it is in order. An array of strings would be the easiest, I imagine, and answers on that front are appreciated, but an answer that includes the ability to check for order based on some arbitrary parameter is optimal.

Here's an example dataset. The name of:

[["a", 3],["b",53],["c",2]] 

Where the elements are themselves arrays containing several elements, the first of which is a string. I want to see if the elements are in alphabetical order based on this string.

like image 750
GlyphGryph Avatar asked Nov 04 '11 21:11

GlyphGryph


1 Answers

It looks like a generic abstraction, let's open Enumerable:

module Enumerable   def sorted?     each_cons(2).all? { |a, b| (a <=> b) <= 0 }   end end  [["a", 3], ["b", 53],["c", 2]].sorted? #=> true 

Notice that we have to write (a <=> b) <= 0 instead of a <= b because there are classes that support <=> but not the comparator operators (i.e. Array), since they do not include the module Comparable.

You also said you'd like to have the ability "to check for order based on some arbitrary parameter":

module Enumerable     def sorted_by?     each_cons(2).all? { |a, b| ((yield a) <=> (yield b)) <= 0 }       end end  [["a", 3], ["b", 1], ["c", 2]].sorted_by? { |k, v| v } #=> false 

Using lazy enumerables (Ruby >= 2.1), we can reuse Enumerable#sorted?:

module Enumerable     def sorted_by?(&block)     lazy.map(&block).sorted?   end end 
like image 141
tokland Avatar answered Oct 05 '22 08:10

tokland