2013-10-07 4 views
-1

J'ai essayé pendant plusieurs heures de faire ce travail.Trouver la valeur maximale dans une classe en ruby ​​

Je possède ce code où j'ai environ 20 personnes différentes, avec des âges différents et des noms.

comment puis-je faire ruby ​​la recherche à travers tous les âges et de montrer l'âge le plus élevé au fur et à nombre entier

j'ai cherché beaucoup, mais ne peux pas sembler le faire fonctionner. J'ai même essayé de le faire trier les chiffres et l'impression du dernier âge, qui doit être le plus grand nombre

def initialize(firstname, familyname, age) 
    @firstname = firstname 
    @familyname = familyname 
    @age = age 

Meilleures salutations

+1

Vous devez montrer plus de votre code, y compris/comment toutes les personnes sont définies. Utilisez également le mécanisme de formatage pour les blocs de code (voir l'aide). –

Répondre

2

Si vous avez une classe comme ceci:

class Person 
    attr_accessor :age 
    def initialize(age) 
    @age = age 
    end 
end 

Et un tableau comme celui-ci:

people = [Person.new(10), Person.new(20), Person.new(30)] 

Trouver l'âge maximum

Vous pouvez obtenir les âges avec Array#map:

people.map { |person| person.age } 
#=> [10, 20, 30] 

# or shorter 

people.map(&:age) 
#=> [10, 20, 30] 

et la valeur maximale avec Enumerable#max:

people.map(&:age).max 
#=> 30 

Trouver la personne la plus âgée

Ou vous pourriez trouver la personne la plus âgée avec Enumerable#max_by:

oldest = people.max_by { |person| person.age } 
#=> #<Person:0x007fef4991d0a8 @age=30> 

# or shorter 

oldest = people.max_by(&:age) 
#=> #<Person:0x007fef4991d0a8 @age=30> 

Et son âge avec:

oldest.age 
#=> 30 
+0

Mignonne répondre c'est ...:) –

+1

'max_by' fonctionnera également avec la notation d'esperluette pratique; 'people.max_by (&: age)' – Doydle

+0

@Doydle bon point, je l'ai ajouté à ma réponse – Stefan

0

Say par exemple votre classe comme looks: ce

class Person 
    attr_reader :firstname, :familyname, :age 

    def initialize(firstname, familyname, age) 
    @firstname = firstname 
    @familyname = familyname 
    @age = age 
    end 
end 

Et dites que vous avez un tableau de ces objets appelé people. Ensuite, vous pouvez faire quelque chose comme:

puts people.max_by { |p| p.age }.age 
0

Utilisez max

par exemple

class C 
    attr_accessor :age 
    def initialize(age) 
    @age = age 
    end 
end 

a,b,c,d = C.new(10), C.new(2), C.new(22), C.new(15) 

[a,b,c,d].map(&:age).max #=> 22 
[a.age,b.age,c.age,d.age].max #=> 22 
0

Une fois que vous avez recueilli toutes les instances dans un tableau, en utilisant l'une des techniques montré en How to get class instances in Ruby?, vous pouvez utiliser la technique indiquée en Finding the element of a Ruby array with the maximum value for a particular attribute pour trouver l'âge maximum. Par exemple, si Foo est votre classe et age est un attribut de votre classe, ce qui suit devrait fonctionner:

ObjectSpace.each_object.select{|foo| obj.class == Foo}.max_by {|foo| foo.age} 
Questions connexes