On 08/03/07, Justin Collins <collinsj / seattleu.edu> wrote:
> Farrel Lifson wrote:
> > On 08/03/07, Jason Burgett <jasbur / gmail.com> wrote:
> >> I have a series of objects in an array. Each object corresponds to an
> >> application and has several attributes. For instance I can call:
> >>
> >> @application.name
> >> @application.icon
> >> @application.ranking
> >>
> >> "ranking" is always an integer. So if I have an array of these objects,
> >> say, @allApplications how do I sort using each application's ranking
> >> (@application.ranking)?
> >>
> >
> > applications.sort_by{|object| object.ranking}
> >
>
> Another way would be to add a <=> method
>
> class Application
>   def <=> other
>      self.ranking <=> other.ranking
>   end
> end
>
> -Justin
>
>

Using only <=> does have some speed consequences:

require 'benchmark'
srand

class Application
  attr_reader :ranking
	def initialize
	  @ranking = rand
	end
	def <=>(other)
		@ranking <=> other.ranking
	end	
end

applications = Array.new(1000000){Application.new}

Benchmark.bm do |bmark|
	bmark.report("Sort")  { applications.sort }
	bmark.report("Sort By") {applications.sort_by {|o| o.ranking}}
end

C:\Documents and Settings\flifson\Desktop>ruby sort_test.rb
                user           system      total          real
Sort        20.782000   0.031000   20.813000 ( 20.844000)
Sort By  6.687000     0.000000   6.687000   (  6.687000)

Farrel