Aiuto su breve programma che non va ....

di il
2 risposte

Aiuto su breve programma che non va ....

Salve a tutti.

Sto cercando di imparare java e ho scritto questo breve codice:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.*;

import javax.swing.JOptionPane;


public class Legge {

	public static void main(String [] args) throws FileNotFoundException, IOException {
		// TODO Auto-generated method stub
		int Quante = -1;
		int wLen = 0;
		boolean isAnagramma;
		String strCerca = new String("OCSA");
		String cW = new String("");
		// Array
		String[] dizionario = new String[1000000];
		
		BufferedReader reader = new BufferedReader(new FileReader("dizionario.txt"));
        String Parola = reader.readLine();
        
        while(Parola!=null) {
            Parola = reader.readLine();
            if (Parola!=null) {
            dizionario[++Quante] = Parola;
            // System.out.println(dizionario[Quante]);
            }
        }
        reader.close();
        
        wLen=strCerca.length();
        for (int k = 0; k <= Quante; k++) 
        {
        	// <<<<==== viene svolto una sola volta
        	if (dizionario[k].length()==wLen) 
        	{
            
        		cW = dizionario[k];
        		isAnagramma = true;
        		if (strCerca.length() == cW.length())    
        			//verifica anagramma
        			for (int i = 0; i < strCerca.length(); i++) 
        			{
        				char c = strCerca.charAt(i);
        				int indice = cW.indexOf(c);
        				if(indice >= 0)
        				{
        					cW = cW.substring(0,indice) + cW.substring(indice+1);
        				}
        				else
        				{
        					isAnagramma = false;
        				}
        			}
        		if (isAnagramma) 
        		{
        			System.out.println(dizionario[k]);
        		}
        		
        	}		
        }		
        System.out.println(Quante);
	}
}
Il codice, nella prima parte importa in un array (dizionario[]) le parole presenti in un file di testo (e questo lo fa correttamente).

Poi, dovrebbe :
leggere le parole dall'array
verificare se la lunghezza della parola del dizionario è uguale a quella di una stringa data "OACS", nel caso specifdico)
se vero, verificare se la parola "OACS" è anagramma di quella nel dizionario
se si, la stampa a video e continua fino alla fine

Il problema è che, pur essendo la variabile "Quante" pari a 683.748, il ciclo (contrassegnato da <<<==== viene seguito una sola volta .....

Non capisco il perchè.
Potreste darmi una mano ?

Grazie.


A margine:
Uso eclipse e vorrei sapere, impostati i breackpoint, ogni volta che si ferma l'esecuzione in basso viene selezionato il tab "Console". C'è un modo per far visualizzare di default il tab "Expressions" dove vedo i valori delle varibili in osservazione ?


P.S. per l'amministratore:
avevo postato ieri sera un analogo messaggio che però non trovo nella lista dei post. Se dovesse essere duplicato, il primo può essere cancellato.

2 Risposte

  • Re: Aiuto su breve programma che non va ....

    Guarda, ho provato a eseguire il codice con un file scritto al volo (6 righe) e, come mi aspettavo, il ciclo fa 5 iterazioni.
    Infatti, come ti è stato detto nell'altra discussione se non sbaglio, la prima riga del file la salti, perché il primo readLine non viene assegnato a nulla.

    Ma, a parte questo, tutte le altre iterazioni vengono eseguite, come fai a dire che il ciclo viene eseguito una sola volta? Hai provato a fare un semplice System.out.println (k) come prima istruzione del ciclo?

    Oltre a questo, stai già facendo un if (dizionario[k].length()==wLen), perché dopo fai un altro if con lo stesso confronto?

    Per il resto ti converrebbe anche mettere un break quando metti isAnagramma a false, per interrompere il ciclo sui caratteri della stringa, quando una lettera non viene trovata non serve andare avanti a cercare le altre, perdi tempo per nulla ...

    Come ultima cosa ti consiglio di usare sempre le minuscole per i nomi delle variabili (attieniti alle convenzioni del linguaggio per i nomi), e magari di usare nomi più significativi per le variabili (ad es. cW, wLen dicono poco ...)
  • Re: Aiuto su breve programma che non va ....

    Ok. Grazie.

    In effetti, grazie ai tuoi consigli, ho scoperto che il ciclo lo faceva perfettamente, ma non trovata nulla perchè facevo un confronto tra un maiuscolo e un minuscolo ("OCSA" e "cosa").
    Risolto utilizzando la .toUpperCase.

    Ora il prossimo step.....

    Il programmino funziona perfettamente se deve trovare le parole composte da tutte le lettere indicate (quindi un anagramma completo).

    Ora dovrei implementare una funzione che, data una stringa di caratteri ("ABCOA") ed un numero compreso tra 2 e la lunghezza massima della stringa (in questo caso 5), mi estragga tutte le combinazioni possibili (anche senza senso) componibili con le "x" lettere della stringa.
    Per esempio con 3 dovrei ottenere:
    abc, abo, aba, acb, aco, aca, aoa, bco,bca,bac,bao,baa,boa,coa,cab,cba,cbo,cba (e non so se ce ne sono altre...)

    Queste combinazioni le passerei alla routine già fatta per confrontarne la presenza nel dizionario.

    Sapreste darmi qualche suggerimento ?
    Grazie
Devi accedere o registrarti per scrivere nel forum
2 risposte