Setembro 2021
A função sortTome cuidado ao usar a função sort sem uma função de comparação adequada quando o array contém números! A função sort, sem uma função de comparação, primeiro converte os elementos para String e depois os ordena, o que pode levar a resultados indesejados! Mais detalhes aqui ordena um array de acordo com um determinado critério.
Se uma função de comparação não for usada, o array é ordenado de forma ascendente (todos os elementos são tratados como Strings!)
Caso uma função de comparação seja usada, ela deve seguir o seguinte padrão:
function compare(a, b) {
if (/*a é menor do que b de acordo com algum critério de ordenação*/) {
return -1
}
if (/*a é maior do que b de acordo com algum critério de ordenação*/) {
return 1
}
// a é igual a b
return 0
}
Exemplos de uso da função sort
let nomes = ["Roberto", "Mariana", "Leticia", "Beatriz"]
console.log(nomes.sort())
let compara = function (a, b){
if (a-b > 0 ) { //a é maior do que b
return 1
}
else{
if (a-b < 0) { // a é menor do que b
return -1
}
else{ // os dois números são iguais
return 0
}
}
}
let numeros = [2, 20, 1, 1.1, -1 , 44, 0, 8, 80, 9]
console.log(numeros.sort(compara))
O primeiro passo consiste em entender o problema e definir claramento o contexto em que o problema está definido. De acordo com a formulação do problema temos:
Entrada: Consideramos como entrada todos os elementos que serão fornecidos para que o programa possa ser executado. No caso, temos um array de Strings
Saida: O resultado do programa. No caso, temos como saída também um array de Strings
Processo: Esse é exatamente o objetivo do programa, ou o que o programa deve fazer para que uma determinada entrada seja transformada em uma determinada saida. Temos então, genericamente:
Array de String → O símbolo → nesse contexto simboliza uma transformação ou produção, no sentido de que o programa irá transformar a entrada em uma saída. Array de String (ordenado por tamanho)
ou
Array de String → Array de String (ordenado reverso)
Esse programa no caso exibe dois comportamentos específicos. Como não foi especificado uma forma de "selecionar" qual dos comportamentos será utilizado quando uma determinada entrada (array) for apresentada, cabe a vocês apenas criar as funções que atingem esses objetivos (comportamentos).
Construindo exemplos
Caso 1: Ordenado por tamanho
[] → []
["abra"] → ["abra"]
["abra", "cadabra"] → ["abra", "cadabra"]
["casa", "assado", "mato", "ele"] → ["ele", "casa", "mato", "assado"]
["ffffff", "a", "ccc", "bb", "dddd", "eeeee"] → ["a", "bb", "ccc", "dddd", "eeeee", "ffffff"]
Caso 2: Ordem alfabética reversa
[] → []
["abra"] → ["abra"]
["abra", "cadabra"] → ["cadabra", "abra", ]
["casa", "assado", "mato", "ele"] → ["mato","ele", "casa","assado"]
["ffffff", "a", "ccc", "bb", "dddd", "eeeee"] → ["ffffff", "eeeee", "dddd", "ccc", "a", "bb"]
De acordo com as saídas e o comportamento do programa, além da descrição do problema, identificamos a necessidade de criar a representação de dois comportamentos diferentes dentro do programa: um que ordena pelo tamanho um array, outro que ordena de forma alfabética decrescente.
Sabemos que já existe uma função no JavaScript (dentro do prototype array) que retorna um array ordenado (veja instruções antes do problema). Também sabemos que a forma de ordenação do array depende da função de comparação fornecida como parâmetro (logo sort também é uma Higher-order Function!). Logo o nosso planejamento geral é:
Temos o primeiro esqueleto do nosso programa:
//compara dois elementos do array e retorna o código de acordo o critério de ordenação
let comparaDesc = function (a, b){
}
//compara dois elementos do array e retorna o código de acordo o critério de ordenação
let comparaTamanho = function (a, b){
}
//Um array qualquer, com qualquer um dos valores dos exemplos acima
let meusValores = [??????????????]
//Ordena o array meusValores de forma alfabética decrescente
console.log(meusValores.sort(comparaDesc))
//Ordena o array meusValores pelo tamanho de cada String
console.log(meusValores.sort(comparaTamanho))
Já entendido o contexto do problema e a estrutura (esqueleto) da solução, finalmente escrevemos o código da solução.
Para a solução da função comparaDesc
, lembramos a estrutura das funções de comparação. Comparamos um grupo de dois elementos e estabelecemos uma relação entre eles a qual dirá onde cada elemento será inserido no array resultante.
Ou seja, quando o resultado da comparação for igual a -1, signfica que o elemento a
fica antes do elemento b
no array resultante. Se o resultado for 1, o contrário (a
vem depois de b
no array resultante).
Lembrando, que para variáveis String o operador >
estabelece uma relação de orde alfabética entre elementos. Logo a > b
significa que a String a
vem antes da String b
em ordem alfabética.
let comparaDesc = function (a, b){
if (a > b ) {
return -1
}
else{
if (a < b) {
return 1
}
else{
return 0
}
}
}
Para a solução da função comparaTamanho
, usamos a mesma estrutura das funções de comparação. A propriedade length
de cada String retorna seu tamanho. Portanto, basta comparar os tamanhos de cada elemento, dois a dois, dentro da função de comparação.
let comparaTamanho = function (a, b){
if (a.length < b.length ) {
return -1
}
else{
if (a.length > b.length) {
return 1
}
else{
return 0
}
}
}
Será que o programa realmente atinge os objetivos propostos e soluciona o problema?
Para tanto, é essencial que testemos o programa! Usando os exemplos do passo 2, o nosso programa resulta na mesma saída? Ou seja, para cada um dos arrays de entrada dos exemplos, a saída correspondente é apresentada?
Não se limite aos exemplos usados anteriormente. Construa novos exemplos e verifique a saída do programa. Verifique se o programa atende corretamente aos dois critérios!
Você pode testar se escreveu a solução corretamente comparando com a minha solução aqui.
Você pode usar um visualizador de código para observar o comportamento do programa, ou simular várias execuções do mesmo em uma REPL.
Você pode escrever e testar o programa comparando com a minha solução aqui
O primeiro passo consiste em entender o problema e definir claramento o contexto em que o problema está definido. De acordo com a formulação do problema temos:
Entrada: Uma String de qualquer tamanho contendo o texto a ser limpo.
Saida: O resultado do programa. Uma String "limpa" de acordo com os critérios do problema.
Processo: Esse é exatamente o objetivo do programa, ou o que o programa deve fazer para que uma determinada entrada seja transformada em uma determinada saida. Temos então, genericamente:
String → String (limpa)
Construindo exemplos
"" → ""
"Lo#rem / / ipsum do$lor sit & & amet." → "Lorem . . ipsum dolor sit amet."
"Lorem & ipsum dolor $ 10/10/76 sit amet, conse%ctetur adipis#cing elit. Phasellus mattis."→ "Lorem ipsum dolor 10.10.76 sit amet, conse%ctetur adipiscing elit. Phasellus mattis."
De acordo com o problema, temos que executar duas tarefas:
Uma sequência de planos para solucionar o problema seria
String de entrada → aplicar função para substituir caracter / por . → aplicar funcao para remover caracteres inválidos → apresentar a String de saída
Identificando Padrões
Sabemos que a função map é capaz de atuar em cada elemento de um array. Portanto, podemos fazer a substicuição de "/" por "." verificando o valor de cada elemento e caso este seja igual a "/", substituimos por "."
Sabemos que a função filter é capaz de remover elementos de um array de acordo com um determinado critério. Lembrando que o filter atua aplicando funções que retornam true ou false
de acordo com o critério adotado.
Entretando, tanto a função map quanto filter atuam em arrays e não em Strings. Portanto, devemos primeiro particionar a String em um array, onde cada caracter da String se torna um elemento de um novo array usando a função split. A função split, tendo como parâmetro o caracter vazio ("") produz exatamente este resultado.
A função reduce dos arrays pode ser usada para "colar" todos os elementos em uma única String. Uma dica é utilizar a função concat
Temos então a nova sequência de planos
String de entrada → quebrar a String caracter por caracter → aplicar função para substituir caracter / por . → aplicar funcao para remover caracteres inválidos → apresentar a String de saída
Temos o primeiro esqueleto do nosso programa:
//Se o caracter for igual a uma "/", retorna um ".". Caso contrário retorna o proprio caracter inalterado
let substituiBarra = function (caracter){
}
//Se o caracter for igual a qualquer um dos caracteres inválidos, não será inserido no array resposta. Caso contrário, todos os outros caracteres serão inseridos.
let removeInvalidos = function (caracter){
}
//Uma String qualquer, de qualquer tamanho
let texto = "??????????????"
//Quebra String em um novo array, caracter por caracter
//Aplica o map para substituir o caracter /
//Remove os caracteres inválidos com filter
//Junta o array em uma única String
console.log(stringFinal)
De acordo com as instruções descritas no terceiro passo, complete o programa que solucionará o problema proposto.
Será que o programa realmente atinge os objetivos propostos e soluciona o problema?
Para tanto, é essencial que testemos o programa! Usando os exemplos do passo 2, o nosso programa resulta na mesma saída? Ou seja, para cada um dos arrays de entrada dos exemplos, a saída correspondente é apresentada?
Não se limite aos exemplos usados anteriormente. Construa novos exemplos e verifique a saída do programa. Verifique se o programa atende corretamente aos dois critérios!
Você pode testar a sua solução e comparar com a minha solução aqui.
Você pode usar um visualizador de código para observar o comportamento do programa, ou simular várias execuções do mesmo em uma REPL.
Criem exemplos que os ajudem a entender o que o problema está pedindo e se vocês realmente compreenderam todos os detalhes!
Identifiquem as etapas para a solução do problema. É sempre aconselhável a refinar (quebrar) sua solução até o momento em que cada etapa seja claramente traduzível em código no seu programa.
Dicas: Revisem as funções map, filter, slice e indexOf dos materiais de aula.
Será que o programa realmente atinge os objetivos propostos e soluciona o problema?
Para tanto, é essencial que testemos o programa! Usando os exemplos do passo 2, o nosso programa resulta na mesma saída? Ou seja, para cada um dos arrays de entrada dos exemplos, a saída correspondente é apresentada?
Não se limite aos exemplos usados anteriormente. Construa novos exemplos e verifique a saída do programa. Verifique se o programa atende corretamente aos dois critérios!
Você pode testar a sua solução comparando com a minha solução aqui.
Você pode usar um visualizador de código para observar o comportamento do programa, ou simular várias execuções do mesmo em uma REPL.
Observe que apesar de alguns palíndromos conterem pontuação e espaços em branco, a pontuação e os espaços são ignorados (removidos) ao verificar se uma frase é um palíndromo ou não.
O perfil @OPalindromista é muito famoso por criar respostas para todas as situações utilizando palíndromos.
AI, MOTA, GATO MIA!#palindromo #DiaMundialDoGato pic.twitter.com/mg9Qy3608l
— O Palindromista (@OPalindromista) February 17, 2020
Considere que todas as Strings de entrada usam letras minúsculas e não contém acentos ou outros sinais gráficos. Mas a String de entrada pode conter pontuação (. , ! ?) ou espaços em branco que devem ser removidos.
Identifiquem as etapas para a solução do problema. É sempre aconselhável a refinar (quebrar) sua solução até o momento em que cada etapa seja claramente traduzível em código no seu programa.
Dicas: Revisem as funções map, filter, slice e indexOf dos materiais de aula.
Para "inverter" um array (os elementos do fim são trocados com os do ínicio), basta usar a função reverse(): minhavariavelarray.reverse()
Será que o programa realmente atinge os objetivos propostos e soluciona o problema?
Para tanto, é essencial que testemos o programa! Usando os exemplos do passo 2, o nosso programa resulta na mesma saída? Ou seja, para cada um dos arrays de entrada dos exemplos, a saída correspondente é apresentada?
Não se limite aos exemplos usados anteriormente. Construa novos exemplos e verifique a saída do programa. Verifique se o programa atende corretamente aos dois critérios!
Você pode testar a sua solução e comparar com a minha solução aqui
Você pode usar um visualizador de código para observar o comportamento do programa, ou simular várias execuções do mesmo em uma REPL.