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.