Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Sem erros no algoritmo do palíndromo

Olá instrutores, tudo certo? No exercício do palíndromo, nos é fornecido uma classe que verifica se uma frase é palíndroma ou não. Pesquisando o fórum e fazendo os testes sugeridos pelo exercício, verifiquei que não havia bug no algoritmo do palíndromo. Então, removi os parênteses da linha 10, da classe, para que o o java ultrapasse o comprimento da frase a ser testada, pois isso quebra a precedência da soma do contador com 1. Desta forma, sem os parênteses, ele primeiro subtrai o numero de caracteres totais da frase menos o contador que vale 0 no início da iteração, e depois soma com 1. Assim, o indice do último caracter vai ultrapassar em um o comprimento da string. Abs,

4 respostas

Oi Guido, tudo bem ?

Acredito que você forçou o erro, rs.

Acho que a ideia seria testar todos os casos da classe.

Olá instrutores, tudo certo? Ainda sobre o algoritmo do palíndromo, o algoritmo está como apresentado no exercício. Gostaria de apresentar minha classe de testes, pois gostaria de receber auxílio em relação aos casos de testes da classe do palíndromo. Gostaria de saber, o que pode ser melhorado no teste, pois ainda não consegui encontrar o bug. Segue a classe palíndromo e a classe de testes abaixo. Desde já, agradeço. Abs,

package br.com.caelum.leilao.exercicios;

public class Palindromo {

    public boolean ehPalindromo(String frase) {

        String fraseFiltrada = frase.toUpperCase().replace(" ", "").replace("-", "");

        for (int i = 0; i < fraseFiltrada.length(); i++) {
            if (fraseFiltrada.charAt(i) != fraseFiltrada.charAt(fraseFiltrada.length() - (i + 1))) {
                return false;
            }
        }
        return true;
    }

}
package br.com.caelum.leilao.exercicios;

import org.junit.Assert;
import org.junit.Test;

public class PalindromoTest {

    @Test
    public void testaSeEhPalindromoEValidaCaracteresInvalidos() {
        Palindromo verificador = new Palindromo();
        String frase = "Socorram-me subi no onibus em Marrocos";
        boolean resposta = verificador.ehPalindromo(frase);
        Assert.assertTrue("erro no algoritmo", resposta);
    }

    @Test
    public void testaSeEhPalindromo() {
        Palindromo verificador = new Palindromo();
        String frase = "Anotaram a data da maratona";
        boolean resposta = verificador.ehPalindromo(frase);
        Assert.assertTrue("erro no algoritmo", resposta);
    }

    @Test
    public void testaSeNaoEhPalindromo() {
        Palindromo verificador = new Palindromo();
        String frase = "É preciso amar as pessoas como se não houvesse o amanhã";
        boolean resposta = verificador.ehPalindromo(frase);
        Assert.assertFalse("Erro no algoritmo", resposta);
    }
}
solução!

O bug está justamente na hora de pegar o caractere do fim da frase. Precisamos subtrair 1, afinal o array vai de 0 até tamanho da string -1.

public class Palindromo {

    public boolean ehPalindromo(String frase) {

        String fraseFiltrada = frase
                .toUpperCase().replace(" ", "").replace("-", "");

        for(int i = 0; i < fraseFiltrada.length(); i++) {
            if(fraseFiltrada.charAt(i) != 
                    fraseFiltrada.charAt(fraseFiltrada.length() -(i+1))) {
                return false;
            }
        }

        return true;
    }
}
Olá instrutores, tudo certo?
Entendi a resolução passada no tópico. Agradeço desde já. 
Pelo o que podemos observar, tanto a classe Palindromo que enviei para a análise quanto a resolução enviada pelo instrutor ficaram praticamente idênticas, com pouquíssimas diferenças na formatação do código.
O estranho, é que a classe que enviei para análise, é a mesma que aparece na atividade 12, lá no exercício.
Quando criei a classe Palindromo, fiz um control C control V do código do exercício para a classe, e ela funcionou sem problemas, passando nos testes do junit. 
Até vou verificar no exercício, para ver se o algoritmo é o mesmo que copiei.
Agradeço novamente.
Abs,