Palindroma

Olá pessoal,

Estou a fazer um programa que detecta palindromas contidos num ficheiro de texto, mas estou com alguma dificuldade. Para cada palavra quero que seja testado se se trata de um palidroma ou não e se sim apresentar a palavra.
Envio-vos aqui o meu código, só que ainda nao faz o que eu quero. :roll: Espero que me possam ajudar :lol:

Obrigada desde já pelas vossas respostas.

[code]
public static boolean palindroma(String s)
{
int l=s.length();

	if (l<2)
		return true;
	else 
		if (!s.substring(0,1).equals(s.substring(l-1,l))) 
			return false;
		else
			return palindroma(s.substring(1,l-1));		
		
	
}

public static void main(String[] args) throws IOException
{
try{
File ficheiro = new File (“Fich.txt”);
FileReader lerFicheiro = new FileReader(ficheiro);
BufferedReader buff = new BufferedReader (lerFicheiro);
String linha;
String chaine= “”;

	linha = buff.readLine();
	
	
	while ((linha=buff.readLine())!=null)
	{
		System.out.println(linha);
		chaine+=linha+"\n";
		if (palindroma(chaine))
		{
			System.out.println("palavra: " +chaine);
		}
	}
	buff.close();
}	
catch (Exception e)
{
		System.out.println(e.toString());
}

}[/code]

Só falta a parte de leitura de arquivo.
Eu criaria uma classe interna pra ser responsável por isso.

[code]
public class AchaPalindromos{
public static void main (String [] args){
String str = “socorram me subino onibus em marrocos”;

	System.out.print (isPalindromo (str) ? str + " é um palíndromo." : str +  " não é palíndromo.");
}

private static boolean isPalindromo (String palavra){
		if (palavra.length() < 2) return true;
		int i = 0;
		int inicio = 0, fim = palavra.length() - 1;
		while (i < palavra.length() /  2){
			if (palavra.charAt (inicio) != palavra.charAt(fim))
				return false;
			i++;
			inicio++;
			fim--;
		}
		return true;
		
	}

}[/code]

Boa solução rod.attack. Só um detalhe, sua variável i tá à toa.

O i tá sendo usado pra controlar o número de iterações do loop.

Você pode usar variável inicio no lugar de i. :wink:

Você pode usar variável inicio no lugar de i. :wink: [/quote]

Em termos de economia de memória (nesse caso 4 bytes) de fato a melhor escolha é usar o início para seu propósito principal e também como controladora de loop. Só que assim você perde em clareza de código.
Se você prefere optar por deixar o código mais claro, precisa assassinar esses valiosos 4 bytes.:wink:

Bom, então chegamos a um impasse pessoal, eu sou totalmente contra micro-performances, mesmo quando não há perda de legibilidade, mas pessoalmente acho que uma variável e duas linhas de código a menos tem mais clareza. E quem disse que uma variável só pode servir a um propósito? Aliás, se é pra alinhar a variável ao seu propósito, os nomes inicio e fim não são os mais apropriados, uma vez que elas representam não o início e fim da palavra e sim o índice de um char na, respectivamente, primeira e segunda metade da palavra. Eu usaria charDireito e charEsquerdo, por exemplo.

Por fim, mesmo usando “inicio”, pra mim um “enquanto o ‘inicio’ for menor que a metade da palavra”, ainda é mais claro que um “enquanto a variável ‘i’…”

antes de buscar os palindromics vc precisa receber o texto e quebralo em palavras depois ele deve analisar cada vetor e guardalo se for um palindrome.

Usa o splint pra quebrar as palavras é mais fácil que criar um novo metodo so pra isso

Bom, então chegamos a um impasse pessoal, eu sou totalmente contra micro-performances, mesmo quando não há perda de legibilidade, mas pessoalmente acho que uma variável e duas linhas de código a menos tem mais clareza. E quem disse que uma variável só pode servir a um propósito? Aliás, se é pra alinhar a variável ao seu propósito, os nomes inicio e fim não são os mais apropriados, uma vez que elas representam não o início e fim da palavra e sim o índice de um char na, respectivamente, primeira e segunda metade da palavra. Eu usaria charDireito e charEsquerdo, por exemplo.

Por fim, mesmo usando “inicio”, pra mim um “enquanto o ‘inicio’ for menor que a metade da palavra”, ainda é mais claro que um “enquanto a variável ‘i’…”[/quote]

Concordo com os nomes para as variáveis.

Não entendi pq vc disse isso: “eu sou totalmente contra micro-performances, mesmo quando não há perda de legibilidade”. .

“mas pessoalmente acho que uma variável e duas linhas de código a menos tem mais clareza.”

Tem certeza?

O que vc me diz dos dois trechos de código abaixo. Qual o mais claro?

File file = new File ("arquivo.txt");
		boolean arquivoCriado = file.createNewFile();
		System.out.println (arquivoCriado ? "Arquivo criado" : "Arquivo não criado");

System.out.println ( new File("Arquivo.txt").createNewFile() ? "Arquivo criado" : "Arquivo não criado");

Sou ainda iniciante em java e gostaria de ter um maior conhecimento dos códigos e suas utilidades, sabe não conheço muitos pacotes, se puder me ajudar, me informe algum site com exercícios básicos e novos conteúdos.

Da pra explicar o seu codigo?

[quote=DavidUser]Sou ainda iniciante em java e gostaria de ter um maior conhecimento dos códigos e suas utilidades, sabe não conheço muitos pacotes, se puder me ajudar, me informe algum site com exercícios básicos e novos conteúdos.

Da pra explicar o seu codigo?[/quote]

Nada melhor do que isso para começar.

Oi,

Obrigado a todos pelas vossas respostas.

O meu problema principal é saber como quebrar as palavras no momento da leitura do ficheiro para depois sim chamar o metodo palindromo para analisar.

Alguem pode dar um exemplo de como quebrar as palavras?

Obrigado.

[quote=raqh]Oi,

Obrigado a todos pelas vossas respostas.

O meu problema principal é saber como quebrar as palavras no momento da leitura do ficheiro para depois sim chamar o metodo palindromo para analisar.

Alguem pode dar um exemplo de como quebrar as palavras?

Obrigado.[/quote]

Adicionei um método de leitura do arquivo a classe que havia mandado anteriormente:

[code]import java.io.;
import java.util.
;
public class AchaPalindromos{
static ArrayList listaDePalavras = new ArrayList ();
public static void main (String [] args){
try{
lerDoArquivo();
}
catch (IOException ioException){
System.out.println (“Exceção de arquivo”);
}

	for (String s : listaDePalavras){
			System.out.println (isPalindromo(s)? s + " é um palíndromo." : s + " não é um palíndromo.");
	}
	

	
}

private static boolean isPalindromo (String palavra){
		if (palavra.length() < 2) return true;
		int i = 0;
		int inicio = 0, fim = palavra.length() - 1;
		while (i < palavra.length() /  2){
			if (palavra.charAt (inicio) != palavra.charAt(fim))
				return false;
			i++;
			inicio++;
			fim--;
		}
		return true;
		
	}
	
private static  void lerDoArquivo ()throws IOException{
	BufferedReader br = new BufferedReader (new FileReader ("palindromos.txt"));
	String aux = null;
	while ( (aux = br.readLine ()) != null){
		listaDePalavras.add (aux);
	}
}

}[/code]

Neste caso, vc precisa criar um arquivo palindromos.txt no mesmo diretório em que estiver rodando a aplicação. Cada palavra deve estar em uma linha separada.

Scanner sc = new Scanner(new File("localizaçãoDoArquivo"));
while (sc.hasNext()) {
    System.out.println(sc.next());
}

Com o Scanner pode ser bem simples. No exemplo, apenas escrevo em linhas separadas (uma palavra por linha) o conteúdo do arquivo. Com algumas adaptações você pode fazer o que precisa.

Hehehe, eu sabia que estava escrevendo uma armadilha pra mim mesmo. Concordo com você nesse ponto.