Classificando o livro de endereços

Nós escolhemos representar o livro de endereços com um array porque arrays têm uma ordem associada. Digamos que queira mudar essa ordem. Suponha, por exemplo, que queremos ordenar o array alfabéticamente. Como é que vamos fazer isso?

Uma segunda olhada em Array#sort

Já usamos o método Array#sort para classificar strings e inteiros. Mas como classificar uma estrutura mais complexa?

Quando o comportamento padrão não é o que você quer, Array#sort lhe permite dizer qual a forma de classificar os dados. Vamos começar com um exemplo simples do livro de endereços:


friends = [
    [ "Joe", "Smith" ],
    [ "Melissa", "Adams"],  
    [ "Sandy", "Koh" ]
]
                       

Sabemos que, por padrão, Array#sort irá classificar pela primeira entrada - neste caso, nomes próprios. Mas pense que queremos classificar pelo último nome. Array#sort não é um iterador, mas para deixá-lo como um vamos adicionar-lhe um bloco de código. Assim:


friends.sort do |a,b|  
    ...
end
                       

O que esse código deve fazer é:

  • - Retornar -1 se a for inferior a b
  • - Retornar 0 se a é igual a b
  • - Retornar 1 se a é maior que b

Com esta informação, a função sabe como classificar seu array.

Valor de retorno

Como você "retorna" um valor? O valor de retorno é simplesmente o valor da última instrução executada. Vamos dar outra olhada no irb.


>> num = 3
=> 3
>> 2 + 3
=> 5
                       

onde => 3 e onde => 5 são os valores de retorno destas expressões.

O operador <=>

Classificar é algo tão comum, que existe um operador para simplificar os valores de retorno. O operador <=> retorna -1, 0, ou 1, que lhe teriam normalmente recebidos. Experimente no irb:


>> 3 <=> 1  # 3 > 1 então <=> retorna 1
=> 1
>> 3 <=> 3  # 3 == 3 então <=> retorna 0
=> 0
>> 3 <=> 5  # 3 < 5 então <=> retorna -1
=> -1
>> "andy" <=> "sam" # "andy" vem antes de "sam"  
=> -1
                       

Classificando pelo último nome

Então nós temos :


friends.sort do |a,b|  
    ...
end
                       

a e b são elementos do array friends. O usual "friends.sort" é equivalente a:


friends.sort do |a,b|  
    a[0] <=> b[0]   # Sort by first entry  
end
                       

Mas nós vamos classificar pela segunda entrada (último nome). Então, façamos isso:


friends = friends.sort do |a,b|  
    a[1] <=> b[1]   # Sort by second entry  
end
# Now 'friends' is sorted by last name.
                       

Classificando o livro de endereços

Agora que nós entendemos o método Array#sort melhor, estamos prontos para personalizar a classificação do livro de endereços. Nós temos:


addressbook.sort do |person_a, person_b|  
    ...
end
                       

person_a e person_b são a estrutura da mesma pessoa. Nós vamos, por exemplo, classificar os contatos pelo primeiro nome.


# p_a == "person a"
addressbook.sort do |p_a, p_b|
    p_a["first name"] <=> p_b["first name"]  
end
                       

Exercícios

1- Escreva abaixo o código para organizar o livro de endereços (addressbook) por nome completo. É isso, primeiro o nome, depois sobrenome.

topo da página

<< Página Anterior | índice | Próxima Página >>
Apostilas de Ruby e RGSS

nossos tutoriais

navegue

livros recomendados