Polindromo em java?

É um programa sobre políndromo em Java, me ajudem está correto?

package java.edu.br.ifpe.lpoo;
public class ExercicioString{
private String palavra = "HANNNA";
private int i;

public setPalavra(String palavra){
this.palavra = palavra;
}
public static boolean ePalindromo(String palavra){
for(int i = 0;i <palavra.lenght()-1; i--){
}if(palavra.equals(palavra)){
System.out.println("A palavra" + palavra, "é um palindromo");
return true;
}else{
System.out.println("A palavra" + palavra, "Não é um palindromo");
return false;
  }
 }
}

Não, há alguns erros, o primeiro é esse…

palavra.equals(palavra)

Ele sempre vai dar true, porque você está comparando o parâmetro String palavra com ele mesmo e não com a palavra HANNNA, para essa comparação você terá que usar this…

this.palavra.equals(palavra)

Porém o this não pode ser usar em métodos estáticos… melhor retirar o static do ePalindromo…

Segundo, mesmo você ter feito o for, do jeito que está ele não vai percorrer letra por letra, ele simplesmente vai rodar várias vezes comparando a palavra com outra…

Terceiro, se o método retorna alguma coisa, não recomendo deixar System.out.println no corpo…

Pode tentar assim…

public boolean isPalindromo(String palavra) { //is é uma convenção java, boas práticas
    StringBuilder builder = new StringBuilder(palavra);
    String palavraAoContrario = builder.reverse().toString();
    return this.palavra.equalsIgnoreCase(palavraAoContrario); //tanto faz ser minuscula ou maiuscula
}

Depois num main da vida teste…

public class TestaPalindromo {
    public static void main(String[] args) {
        String palavra = "teste";
        ExercicioString teste = new ExercicioString();
        teste.setPalavra(palavra);

        if (teste.isPalindromo("teste")) {
            System.out.println(palavra + " é um palindromo");
        } else {
            System.out.println(palavra + " não é um palindromo");
        }
    }
}
}
1 curtida

Obrigada, mas eu ainda não aprendi o método builder. O que ele faz?

Não é um método, é uma classe usada para otimizar operações muito grandes com String como concatenações, exemplo ao invés de fazer isso…

String str = "texto";
str += " texto2";
str += " texto3";

Usa-se StringBuilder…

StringBuilder strb = new StringBuilder();
strb.append("texto");
strb.append("texto2");
strb.append("texto3");

Dessa forma o programa não sofre com performance como sofreria com String…

Agora o método reverse faz o conteúdo de StringBuilder ficar de traz para frente, ou seja, inverte a palavra…

public boolean ePalindromo(String palavra){
String palavra = “hannah”;
StringBuilder string builder = new StringBuilder();
builder.reverse();
if(hannah.equalsIgnoreCase(hannah)){ // se a palavra estiver em maiúsculo ou em minúsculo.
System.out.println("A palavra +palavra+, “é um palindromo”);
return true;
}else{
System.out.println(“A palavra” +palavra+, “Não é um palindromo”);
return false;
}
}
}

Vê por favor :blush:
No exercício que o professor passou esse é um dos métodos da classe, ele não pediu pra fazer chamada.

Como assim “fazer chamada”?

E de onde vem a variável hannah, olha creio que você não pegou legal minha tentativa de explicação, sugiro você ler a apostila desde o básico de orientação a objeto…

Você pulou muitas etapas, como atributos, variáveis e métodos estáticos etc, se eu prosseguir vou me cansar e você não vai conseguir entender…

chamada no main cara.

Sem chamada no main seu código nem roda, ou você espera que o método ePalindromo vai ser chamado como?

Está vendo como você pulou várias etapas?

Sim

E se for ver bem, esse monte de variável fora do método você nem precisa, se quiser manter o método estatico pode até deixar…

Outra forma de saber se é um palindromo “na raça” usando for seria…

package java.edu.br.ifpe.lpoo;

public class ExercicioString {
    public static boolean ePalindromo(String palavra) {
        for (int i = 0, j = palavra.length() - 1; i < palavra.length(); i++, j--) {
            if (palavra.charAt(i) != palavra.charAt(j)) {
                return false; // não é palindromo
            }
        }
        return true; // é palindromo
    }
}

Creio que era a forma que você estava querendo fazer, porém você precisa testar letra por letra, ou seja, comparar a primeira com a última, a segunda com a penúltima, etc… por isso esse if

palavra.charAt(i) != palavra.charAt(j)

Onde o i vai de zero até a última letra (palavra.length() - 1) e o j vai da última letra até a primeira que é zero…

Aí você cria uma classe com main só pra testar…

public class TestaPalindromo {
    public static void main(String[] args) {
        String palavra = "osso";

        if (ExercicioString.ePalindromo(palavra)) {
            System.out.println(palavra + " é um palindromo");
        } else {
            System.out.println(palavra + " não é um palindromo");
        }
    }
}

Viu só quantas variáveis você tinha criado à toa?

Eu espero que tenha clareado mais as idéias, mas sugiro mesmo você ler a apostila antes de prosseguir com os estudos, assim você vai entender porque fiz essa chamada no if

ExercicioString.ePalindromo(palavra)

E idenfiticar que se trata de uma chamada estática, sem precisar usar new em qualquer objeto…

Bons estudos!

SIM, OBRIGADA MESMO! mesmo sendo um exercício eu estou tentando para desenvolver a minha logica e fazer do meu jeito entende? mas serviu muitoooo sua ajuda!

1 curtida

Ajustei o texto acima, esclarecendo mais alguns pontos, principalmente os índices dentro do for…

isso e a chamada dentro do if, é que meu professor passa um conteúdo em uma semana e na outra outro, é muito rápido kkk.

Bom, se o professor está passando o conteúdo rápido demais e além de você outras pessoas estão com dificuldades, melhor todos se reunirem e “puxarem a orelha” dele, sinal que ele não está sabendo repassar os conhecimentos…