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] # CaraA forma abreviada também funciona: words.sort_by(&:length).
Desafio
MédioO 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:
- Nomes ordenados pelo valor de estoque em ordem decrescente, unidos por
,(usesort_byno valor derivado) - O nome do produto com a maior quantidade entre os itens com preço abaixo de 5 (use
max_byem uma lista filtrada) - O nome do produto mais barato cuja quantidade seja pelo menos 10 (use
min_byem uma lista filtrada)
Para o array padrão, a saída é:
cheese, milk, bread, apple
bread
breadExperimente 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)
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
1Strings em Profundidade
Visão Geral dos Métodos de StringInterpolação de StringsPercorrendo StringsDividir e UnirRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA Palavra-chave yieldParâmetros de BlocoProcs e LambdasRevisão - Iterador Personalizado7Hashes - Parte 2
Hash.new com Valores PadrãoIterando sobre HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um intervalo?Métodos de intervaloIntervalos em Case / WhenRevisão - Prática com intervalos5Potência do Enumerable
Select e RejectEncadeando MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Pipeline de DadosPratique por conta própria: Compilador de Ruby online