Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    5

    Ricerca di parola in una frase

    Ciao a tutti sono nuovo del forum e sto imparando Java da autodidatta.
    Ho conseguito il diploma di perito informatico (usando Visual Basic) ma ormai sono passati 5 anni senza fare pratica e sono un po' arrugginito

    Volevo esporvi questo esercizio trovato su di un libro:

    " Scrivere un programma che legge una stringa dalla tastiera e verificare se essa contiene la parola "console". Il programma deve essere in grado di stabilire che anche la parola "cOnsOlE" è indesiderata (come qualsiasi altra combinazioni di maiuscole/minuscole). Si estenda il programma in modo che individua le parole indesiderate prese come parole a se stanti e non come parti di altre parole. Per esempio non deve trovare parole come panconsole, consolelle,.. etc. ""

    Ecco il mio programma:

    codice:
     package ricercaparole1;
    
    import java.util.Scanner;
    
    /**
     *
     * @author
     */
    public class RicercaParole1 {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            String s, s1;
            int indice = 0, lunghezzaStringa;
            char lettera;
            boolean trovato = false;
            Scanner tastiera = new Scanner(System.in);
            
            System.out.println("Scrivi una frase");
            s = tastiera.nextLine();
            
            // Uniformo tutti i caratteri della stringa in caratteri minuscoli
            lunghezzaStringa = s.length();
            s1 = s.toLowerCase();
            
            while ((!trovato) && (indice < lunghezzaStringa)){
                lettera = s1.charAt(indice);
                if (lettera == 'c'){
                    // Controllo che non arrivi a fine stringa dentro il while
                    if (indice + 1 < lunghezzaStringa) {
                        indice += 1;
                        lettera = s1.charAt(indice);
                    }                
                    if (lettera == 'o'){
                        // Controllo che non arrivi a fine stringa dentro il while
                        if (indice + 1 < lunghezzaStringa) {
                            indice += 1;
                            lettera = s1.charAt(indice);
                        }
                        if (lettera == 'n'){
                            // Controllo che non arrivi a fine stringa dentro il while
                            if (indice + 1 < lunghezzaStringa) {
                                indice += 1;
                                lettera = s1.charAt(indice);
                            }
                            if (lettera == 's'){
                                // Controllo che non arrivi a fine stringa dentro il while
                                if (indice + 1 < lunghezzaStringa) {
                                    indice += 1;
                                    lettera = s1.charAt(indice);
                                }
                                if (lettera == 'o'){
                                    // Controllo che non arrivi a fine stringa dentro il while
                                    if (indice + 1 < lunghezzaStringa) {
                                        indice += 1;
                                        lettera = s1.charAt(indice);
                                    }
                                    if (lettera == 'l'){
                                        // Controllo che non arrivi a fine stringa dentro il while
                                        if (indice + 1 < lunghezzaStringa) {
                                            indice += 1;
                                            lettera = s1.charAt(indice);
                                        }
                                        if (lettera == 'e'){
                                            // Controllo che non arrivi a fine stringa dentro il while
                                            if (indice + 1 < lunghezzaStringa) {
                                                lettera = s1.charAt(indice + 1);
                                            }
                                            // Controllo che la parola "console" sia a se stante, a fine stringa o seguita da un punto
                                            if ((indice >= lunghezzaStringa - 1) || (lettera == ' ') || (lettera == '.') || (lettera == '!') || (lettera == '?')){
                                                trovato = true;
                                            } else {
                                                trovato = false;
                                                indice ++;
                                            }
                                        } else {
                                            indice ++;
                                        }
                                    } else {
                                        indice ++;
                                    }
                                } else {
                                    indice ++;
                                }
                            } else {
                                indice ++;
                            }
                        } else {
                            indice ++;
                        }
                    } else {
                        indice ++;
                    }
                } else {
                    indice ++;
                }
            }
            if (trovato){
                 System.out.println("Parola trovata");
            } else {
                 System.out.println("Parola NON trovata");
            }
        }
    }

    Se non ho capito male dovrebbe essere una semplice ricerca.
    Il programma funziona tranne nel caso in cui la parola console non è preceduta da uno spazio.
    Per esempio mi trova la parola "panconsole" che non dovrebbe essere trovata.
    Volevo chiedere la vostra opinione su dove ho sbagliato o dove devo modificare.

    Grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Polso9 Visualizza il messaggio
    Volevo chiedere la vostra opinione su dove ho sbagliato o dove devo modificare.
    Innanzitutto, purtroppo, il codice è parecchio contorto e fumoso, principalmente per via del gran numero di if annidati. Che non va assolutamente bene.

    Per risolvere il problema, bisogna per prima cosa stabilire se puoi/vuoi utilizzare delle funzionalità di un po' più alto livello tipo StringTokenizer o le espressioni regolari per estrarre le parole a sé stanti. Oppure se devi fare tutto "a mano" con della tua logica.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto, purtroppo, il codice è parecchio contorto e fumoso, principalmente per via del gran numero di if annidati. Che non va assolutamente bene.

    Per risolvere il problema, bisogna per prima cosa stabilire se puoi/vuoi utilizzare delle funzionalità di un po' più alto livello tipo StringTokenizer o le espressioni regolari per estrarre le parole a sé stanti. Oppure se devi fare tutto "a mano" con della tua logica.
    Hai ragione ci sono troppi if annidati, ma purtroppo devo fare tutto "a mano".
    Ci sono delle soluzioni per evitare tutti quei if?

  4. #4
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Quote Originariamente inviata da Polso9 Visualizza il messaggio
    Hai ragione ci sono troppi if annidati, ma purtroppo devo fare tutto "a mano".
    Ci sono delle soluzioni per evitare tutti quei if?
    Caspita... in pratica è un unrolling di ciclo, adatto per le massime prestazioni vabbè sto scherzando.

    La risposta è: esistono superalgoritmi per questo tipo di ricerche, alcuni addirittura basati su rolling hash, string matching parziali e chi più ne ha ne metta.
    Ipotizzando invece che sia un esercizietto di tipo accademico, dipende se puoi usare funzioni "furbe" (di libreria) o se devi fare "a mano".

    Per "a mano", ipotizzando quindi che si tratti di un "allenamento", devi stabilire quale sia il carattere di separazione, che penso possa essere realisticamente lo spazio.

    Quindi farai un ciclo doppio (o meglio due cicli innestati), col primo scansioni dall'inizio alla fine (in realtà fine-lunghezza stringa da cercare, ma lasciamo stare questi dettagli) alla ricerca del primo carattere non-spazio.
    Poi verificherai (ciclo interno) se i caratteri successivi sono c o n s o l e e poi la stringa finisce, o c'è uno spazio. Se il riscontro è positivo => hai trovato, altrimenti incrementi la posizione corrente del carattere e continui.

    Come puoi intuire (?) farai un sacco di confronti in più, quindi con complessità caso peggiore O(nm), ma per esercizio può andar bene.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    5
    Grazie per le vostre risposte. Sto provando a risolvere il problema usando Stringtokenizer.
    Questo è quello che ho pensato, ma purtroppo non funziona.

    codice:
     package ricercaparole2;
    
    import java.util.Scanner;
    import java.util.StringTokenizer;
    
    /**
     *
     * @author 
     */
    public class RicercaParole2 {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            String s, s1;
            boolean trovato = false;
            Scanner tastiera = new Scanner(System.in);
            
            System.out.println("Scrivi una frase");
            s = tastiera.nextLine();
            
            // Uniformo tutti i caratteri della stringa in caratteri minuscoli
            s1 = s.toLowerCase();
            
            StringTokenizer frase = new StringTokenizer(s1);
            while (frase.hasMoreTokens()) {
                if (frase.nextToken() == "console"){
                    trovato = true;
                } else {
                    trovato = false;
                }
            }
            
            if (trovato){
                 System.out.println("Parola trovata");
            } else {
                 System.out.println("Parola NON trovata");
            }
     
        }
        
    }

    Non riesco a capire dove sia l'errore, è come se saltasse le parole (token).

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Polso9 Visualizza il messaggio
    codice:
                if (frase.nextToken() == "console"){
    Il contenuto delle stringhe (e degli oggetti, in generale) si confronta con equals() ... non con ==

    Il resto, comunque, non è corretto al 100%. Anche correggendo il confronto della parola, se è uguale è corretto mettere trovato = true. Ma è sbagliato mettere trovato = false quando invece non è quel token che cerchi! Perché ti funzionerebbe solo se "console" fosse l'ultimo token.
    Ultima modifica di andbin; 26-07-2015 a 12:12
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Ribadisco che non serve praticamente a nulla usare funzioni di libreria (sennò ti posto superalgoritmi spaziali).
    Ritengo sia più banalmente un esecizio per impratichirsi con le stringe e il mitico algoritmo naive.

    Fossi in te proverei come ti ho indicato

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    5
    Quote Originariamente inviata da MySQL Visualizza il messaggio
    Ribadisco che non serve praticamente a nulla usare funzioni di libreria (sennò ti posto superalgoritmi spaziali).
    Ritengo sia più banalmente un esecizio per impratichirsi con le stringe e il mitico algoritmo naive.

    Fossi in te proverei come ti ho indicato
    Hai ragione, meglio farsi delle buone basi prima.
    Comunque sono ritornato all'esercizio "a mano" ed ho risolto. Ho aggiunto (come mi avevate proporsto) un controllo se il carattere è uno spazio prima dell'inizio della ricerca della parola.

    Restando in tema non è che avete da consigliarmi un libro su cui studiare? O anche un sito con degli esercizi.

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.