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]
Você pode usar variável inicio no lugar de i. [/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.
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’…”
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.
[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.
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.