Menu
CoddyTech

sort_by, min_by, max_by

Parte da seção Lógica e fluxo do Journey de Ruby da Coddy. Lição 26 de 56.

Você já conhece sort, min e max. As versões _by oferecem controle sobre o que comparar, perfeitas para ordenar dados estruturados.

sort_by recebe um bloco; o bloco retorna o valor a ser comparado para cada elemento:

words = ["banana", "hi", "hello"]
by_length = words.sort_by { |w| w.length }
puts by_length.inspect   # ["hi", "hello", "banana"]

Para ordem decrescente, negue a chave de comparação, -w.length para números, ou chame reverse no resultado.

min_by e max_by retornam o único elemento com o menor / maior valor do bloco:

people = [
  { name: "Ada",   age: 36 },
  { name: "Bob",   age: 22 },
  { name: "Cara",  age: 41 }
]

youngest = people.min_by { |p| p[:age] }
oldest   = people.max_by { |p| p[:age] }
puts youngest[:name]   # Bob
puts oldest[:name]     # Cara

A forma abreviada também funciona: words.sort_by(&:length).

challenge icon

Desafio

Médio

O array products é fornecido, onde cada elemento é um hash com :name, :price e :quantity. O valor de estoque de cada produto é price * quantity.

Imprima três linhas:

  1. Nomes ordenados pelo valor de estoque em ordem decrescente, unidos por , (use sort_by no valor derivado)
  2. O nome do produto com a maior quantidade entre os itens com preço abaixo de 5 (use max_by em uma lista filtrada)
  3. O nome do produto mais barato cuja quantidade seja pelo menos 10 (use min_by em uma lista filtrada)

Para o array padrão, a saída é:

cheese, milk, bread, apple
bread
bread

Experimente você mesmo

products = [
  { name: "milk",   price: 3, quantity:  8 },
  { name: "apple",  price: 1, quantity:  4 },
  { name: "cheese", price: 5, quantity:  6 },
  { name: "bread",  price: 2, quantity: 12 }
]

# TODO: ordenar_por valor de estoque desc; max_por quantidade (preço < 5); min_por preço (quantidade >= 10)
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e fluxo

Pratique por conta própria: Compilador de Ruby online