Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Distinguere le singole parole di una stringa

    Buonasera,
    mi viene chiesto di creare una classe che, data in input una frase, mi restituisca linea per linea le parole che la compongono. Quello che vedete qui sotto é il codice della classe che ho implementato io, la variabile fraseInput memorizza l'intera stringa poi non mi viene stampato niente a video.
    Potreste dirmi dove sbaglio?
    Grazie in anticipo!

    codice:
    import java.util.*;
    import java.io.*;
    import java.lang.Character;
    public class ContaParole {
    
    
        /**
         * @param args
         */
        public static void main(String[] args) 
        {
            // TODO Auto-generated method stub
            Scanner console = new Scanner(System.in);
            System.out.print("Inserisci il testo");
            String fraseInput = console.nextLine();
            console.close();
            //System.out.print(fraseInput);
            ArrayList<String> parole = new ArrayList<String>();
            int i,j=0;
            int inizio = 0;
            int fine = 0;
            boolean isALetter;
            boolean parola = false;
            for(i=0;i<fraseInput.length();i++)
            {
                isALetter = Character.isLetter(fraseInput.charAt(i));
                if(isALetter &&  !parola)
                {
                    inizio = i;
                    parola = true;
                }
                else
                {
                    fine = i;
                    parola = false;    
                    parole.add(fraseInput.substring(inizio, fine));
                }
            }
                
            
            for(i=0;i< parole.size();i++ )
                System.out.println(parole.get(i));
            
            
        }
    
    
    }

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao, ho letto velocemente il codice e secondo me non ha senso quell' "inizio = i". Questo perché ogni volta che trovi una lettera "sposti" l'inizio della parola.

  3. #3
    Intanto grazie per la risposta!
    La variabile inizio assume valore i solo se non abbiamo iniziato una nuova parola, cioè solo se la variabile "parola" assume valore false quindi dubito sia quello il problema, ho fatto una piccola correzione dove valuto meglio il caso in cui il carattere corrente non sia una lettera, ignorando invece quello in cui ci sia una lettera ma "parola" è true.
    Non capisco però perchè continui a non funzionare!
    codice:
    import java.util.*;
    import java.io.*;
    import java.lang.Character;
    public class ContaParole {
    
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) 
    	{
    		// TODO Auto-generated method stub
    		Scanner console = new Scanner(System.in);
    		System.out.print("Inserisci il testo");
    		String fraseInput = console.nextLine();
    		console.close();
    		//System.out.print(fraseInput);
    		ArrayList<String> parole = new ArrayList<String>();
    		int i,j=0;
    		int inizio = 0;
    		int fine = 0;
    		boolean isALetter;
    		boolean parola = false;
    		for(i=0;i<fraseInput.length();i++)
    		{
    			isALetter = Character.isLetter(fraseInput.charAt(i));
    			if(isALetter &&  !parola)
    			{
    				inizio = i;
    				parola = true;
    			}
    			else
    			{
    				if(!isALetter && parola)
    				{
    					fine = i;
    					parola = false;	
    					parole.add(fraseInput.substring(inizio, fine));
    					
    				}
    			}
    		}
    			
    		
    		for(i=0;i< parole.size();i++ )
    			System.out.println(parole.get(i));
    		
    		
    	}
    
    
    }

  4. #4
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ok forse ci siamo: il problema era che non leggeva l'ultima parola della frase perché non riconosceva la fine della frase stessa. Guarda questo: VEDI POST SUCCESSIVO
    Ultima modifica di minomic; 10-02-2014 a 11:37

  5. #5
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    EDIT: questo è meglio.
    codice:
    public static void main(String[] args) 
    	{
    		Scanner console = new Scanner(System.in);
    		System.out.print("Inserisci il testo: ");
    		String fraseInput = console.nextLine();
    		console.close();
    		ArrayList<String> parole = new ArrayList<String>();
    		int inizio = 0;
    		int fine = 0;
    		boolean isALetter;
    		boolean parola = false;
    		for(int i=0;i<fraseInput.length();i++)
    		{
    			isALetter = Character.isLetter(fraseInput.charAt(i));
    			if(isALetter && !parola)
    			{
    				inizio = i;
    				parola = true;
    			}
    			else
    			{
    				if(!isALetter && parola) {
    					fine = i;
    					parola = false; 
    					parole.add(fraseInput.substring(inizio, fine));                    
    				}
    				else if (i == fraseInput.length()-1 && parola) {
    					fine = i;
    					parola = false; 
    					parole.add(fraseInput.substring(inizio, fine+1)); 
    				}
    			}
    		}
    
    
    		System.out.println("Parole:");
    		for(String s : parole) System.out.println(s);
    
    
    
    
    	}

  6. #6

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    C'è un problema nel codice di minomic, che riguarda il trattamento delle cifre. Se la frase contiene dei numeri, questi non vengono riportati nell'output. Ovviamente, tutto dipende da come debba essere trattato questo "particolare" caso.

    Ad ogni modo, dò una soluzione alternativa:

    codice:
    public class DividiParole {
       public static void main(String[] args) {
          Scanner s = null;
          try {
             s = new Scanner( System.in );
             String frase = s.nextLine();
             String[] parole = frase.split("\\s");
             for(String str : parole) {
                System.out.println( str );
             }
          } catch (Exception e) {
             e.printStackTrace();
          } finally {
             if (s != null) {
                try { s.close(); } catch (Exception e) { }
             }
          }
       }
    }

    Se i numeri (o le parole contenenti numeri) non devono essere considerati per l'output, la modifica è irrisoria:

    codice:
    public class DividiParole {
       public static void main(String[] args) {
          Scanner s = null;
          try {
             s = new Scanner( System.in );
             String frase = s.nextLine();
             String[] parole = frase.split("\\s");
             for(String str : parole) {
                if ( !str.matches(".*\\d.*") ) System.out.println( str );
             }
          } catch (Exception e) {
             e.printStackTrace();
          } finally {
             if (s != null) {
                try { s.close(); } catch (Exception e) { }
             }
          }
       }
    }

    Se i simboli di punteggiatura devono essere trattati in modo diverso occorre apportare ulteriori modifiche al codice.

    Ovviamente il mio codice presuppone che si conoscano le RegEx.


    Ciao.
    Ultima modifica di LeleFT; 11-02-2014 a 13:39
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.