Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    16

    [JAVA] Ricerca caratteri e numeri in stringhe

    Ciao a tutti ragazzi, mi sono appena iscritto in quanto ho bisogno di un aiuto in un progetto che sto realizzando per l'università, precisamente per un esame di Programmazione.
    All'interno del programma, mi sono fermato ad un punto in cui devo fare la verifica se un file di testo è formattato secondo una grammatica che ci ha dato il professore.
    Ovvero, io ho un file di testo del genere :

    1 10 30 40 cartone 1200 fragile 1
    2 20 20 30 plastica 450 posta 2
    3 120 20 50 cartone 2300 libri 2

    Faccio leggere il file, e tramite uno split() lo suddivido per campi all'interno di un array.
    Facendo un ciclo, devo controllare che ogni campo sia scritto secondo certi criteri(in questo caso solo caratteri o numeri).
    Che metodo devo usare?

    Adesso posto quello che ho pensato di fare io :

    codice:
    import java.io.*;
    public class LetturaPacco 
    {
    	public void Leggi() throws IOException
    	{
    		String caratteri = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    		String numeri = "1234567890";
    		int incrementoNumeri = 0,incrementoCaratteri = 0;	//Serve per verificare che tutto sia corretto nel file di testo
    		String path ="./src/Elenco Pacchi.pac";
    		FileReader fr = new FileReader(path);
    		BufferedReader br = new BufferedReader(fr);
    		String linea = "";
    		while ((linea = br.readLine()) != null)
    		{	
    			String[] CampiPacco = linea.split(" ");		
    			
    			for(int i = 0 ; i < CampiPacco.length ; i++)
    			{
    				if(i == 4 || i == 6)
    				{
    					if(CampiPacco[i].contains(caratteri))
    						incrementoNumeri++;
    				}
    				else
    				{
    					if(CampiPacco[i].contains(numeri))
    						incrementoNumeri++;
    				}
    			}
    			if(incrementoCaratteri == 2 && incrementoNumeri == 6)
    			{
    				for(int y = 0 ; y < CampiPacco.length ; y++)
    					System.out.print(CampiPacco[y]+ " ");
    			}
    			else
    				System.out.println("Il file presenta errori nei campi.");
    		}
    		//Per vedere se vengano incrementate le 2 variabili
    		System.out.println(incrementoCaratteri);
    		System.out.println(incrementoNumeri);
    	}
    }
    Ma l'output è sempre di questo tipo :

    (In rosso sono cerchiate le 2 variabili che non riesco a far incrementare...)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Ricerca caratteri e numeri in stringhe

    Originariamente inviato da F3aR07
    Facendo un ciclo, devo controllare che ogni campo sia scritto secondo certi criteri(in questo caso solo caratteri o numeri).
    Che metodo devo usare?

    codice:
    if(CampiPacco[i].contains(caratteri))
        incrementoNumeri++;
    A parte il fatto che qui sopra hai incrementato incrementoNumeri mentre invece, teoricamente, avresti dovuto usare incrementoCaratteri ma in ogni caso non funzionerebbe per una questione concettuale!!! contains() verifica se all'interno della stringa in CampiPacco[i] è presente una sottostringa uguale alla stringa contenuta nella variabile 'caratteri' e non è quello che volevi fare!!

    Tu volevi vedere se la stringa in CampiPacco[i] contiene solamente tutti caratteri alfabetici. Non puoi usare contains().

    Potresti fare un metodo apposito che scandisce ogni carattere della stringa e se non è alfabetico ritorna subito false, terminata la scansione ritorna true.

    Ma in ogni caso sarebbe comunque lungo, lo vedi bene da te, no??

    Soluzione: usa (e studia) le espressioni regolari!!

    codice:
    String str = "ciao 123";
    Pattern pattern = Pattern.compile("[a-zA-Z]+ \\d+");
    
    if (pattern.matcher(str).matches()) {
        // corrisponde!
    }
    ( import java.util.regex.*; )
    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
    Jan 2009
    Messaggi
    16
    Grazie. La tua soluzione mi ha portato a risolvere il mio problema.
    Ora però me ne giunge un altro.
    Infatti, secondo la grammatica del file di testo che devo passare come input, le parole presenti in questo file di testo possono essere solamente :
    cartone,plastica,metallo

    1 10 30 40 cartone 1200 fragile 1
    2 20 20 30 plastica 450 posta 2
    3 120 20 50 cartone 2300 libri 2
    come posso confrontare il contenuto dell'indice della riga del mio for, quindi di CampiPacco[i] con queste parole?

    Io ho provato a fare un array con esse e poi a ciclare queste e confrontarle ogni volta con CampiPaco[i].

    Però non va....Mi dareste una mano?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da F3aR07
    secondo la grammatica del file di testo che devo passare come input, le parole presenti in questo file di testo possono essere solamente :
    cartone,plastica,metallo

    1 10 30 40 cartone 1200 fragile 1
    2 20 20 30 plastica 450 posta 2
    3 120 20 50 cartone 2300 libri 2
    Pattern:
    "\\d+ \\d+ \\d+ \\d+ (cartone|plastica|metallo) \\d+ (fragile|posta) \\d+"

    Una cosa del genere (sperando di aver interpretato bene la forma "generica" che ti serve) insomma ... le espressioni regolari sono molto potenti e puoi farci molte cose, basta solo conoscere bene tutti i vari costrutti, che peraltro sono ben documentati nel javadoc di java.util.regex.Pattern (e sulla teoria delle regex trovi molto in rete).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    16
    Grazie ancora dell'assistenza, ma purtroppo il programma non ne vuole sapere di andare.
    Infatti, sia nel tuo modo che in uno che ho pensato io, la variabile incrementoCaratteri rimane sempre a 0, mentre l'altra, incrementoNumeri, raggiunge il valore stabilito da me.
    Posto adesso il codice :

    codice:
    import java.io.*;
    import java.util.regex.*;		//Libreria per le espressioni regolari utili per la verifica di ogni campo dei file
    
    public class LetturaPacco 
    {
    	public void Leggi() throws IOException
    	{
    		//String[] ArrayContenuto = {"cartone", "plastica", "metallo"};
    		//String[] ArrayMateriale = {"fragile", "posta", "libri", "metallo"};
    		Pattern PatternContenuto = Pattern.compile("cartone|plastica|metallo");
    		Pattern PatternMateriale = Pattern.compile("fragile|posta|libri|metallo");
    		Pattern PatternNumeri = Pattern.compile("\\d");
    		//Pattern PatternRiga = Pattern.compile("\\d+ \\d+ \\d+ \\d+ (cartone|plastica|metallo) \\d+ (fragile|posta|libri|metallo) \\d+");
    		int incrementoNumeri = 0,incrementoCaratteri = 0;	//Serve per verificare che tutto sia corretto nel file di testo
    		String path ="./src/Elenco Pacchi.pac";
    		FileReader fr = new FileReader(path);
    		BufferedReader br = new BufferedReader(fr);
    		String linea = "";
    		while ((linea = br.readLine()) != null)
    		{	
    			String[] CampiPacco = linea.split(" ");		
    			
    			for(int i = 0 ; i < CampiPacco.length ; i++)
    			{
    				/*if(PatternRiga.matcher(CampiPacco[i]).matches())
    					System.out.print(CampiPacco[i] + " ");
    				else
    					System.out.println("Il file presenta errori nei campi.");
    			}*/
    				if(i != 4 || i != 6)
    				{
    					
    					if(PatternNumeri.matcher(CampiPacco[i]).matches())
    						incrementoNumeri++;
    				}
    				else
    				{
    					if(i == 4)
    					{
    						if(PatternContenuto.matcher(CampiPacco[i]).matches())
    							incrementoCaratteri++;
    					}
    					else
    						if(i == 6)
    						{
    							if(PatternMateriale.matcher(CampiPacco[i]).matches())
    								incrementoCaratteri++;
    						}
    				}
    			}
    			
    			if(incrementoCaratteri == 2 && incrementoNumeri == 6)
    			{
    				for(int y = 0 ; y < CampiPacco.length ; y++)
    					System.out.print(CampiPacco[y]+ " ");
    			}
    			else
    				System.out.println("Il file presenta errori nei campi.");
    		}
    		//Per vedere se vengono incrementate le 2 variabili
    		System.out.println(incrementoCaratteri);
    		System.out.println(incrementoNumeri);
    	}
    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    codice:
    Pattern pattern = Pattern.compile("\\d+ \\d+ \\d+ \\d+ (cartone|plastica|metallo) \\d+ (fragile|posta) \\d+");
    
    // ....
    
    String linea;
    while ((linea = br.readLine()) != null) {
        if (pattern.matcher(linea).matches()) {
            // corrisponde
        } else {
            // non corrisponde
        }
    }
    Tutto qui .... nessun split, nessun for, nessun test complicato.
    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
    Registrato dal
    Jan 2009
    Messaggi
    16
    Ti ringrazio infinitamente...
    Finalmente ho risolto il mio problema.
    Una chicca che vorrei chiederti : c'è la possibilità anche di leggere non solo int ma anche double come numeri con le espressioni?

    Grazie ancora.
    Posto il codice per chi servisse in futuro:

    codice:
    import java.io.*;
    import java.util.regex.*;		//Libreria per le espressioni regolari utili per la verifica di ogni campo dei file
    
    public class LetturaPacco 
    {
    	public void Leggi() throws IOException
    	{
    		Pattern PatternRiga = Pattern.compile("\\d+ \\d+ \\d+ \\d+ (cartone|plastica|metallo) \\d+ (fragile|posta|libri|metallo) \\d+");
    		String path ="./src/Elenco Pacchi.pac";
    		FileReader fr = new FileReader(path);
    		BufferedReader br = new BufferedReader(fr);
    		String linea = "";
    		
    		while ((linea = br.readLine()) != null)
    		{	
    			 if (PatternRiga.matcher(linea).matches()) 
    			 {
    			        // corrisponde
    				 	String[] CampiPacco = linea.split(" ");
    				 	
    				 	for(int i = 0 ; i < CampiPacco.length ; i++)
    				 	{
    				 		System.out.print(CampiPacco[i]+ " ");
    				 	}
    				 	System.out.println();
    			 } 
    			 else 
    			 {
    			        // non corrisponde
    				 	System.out.println("Il file presenta errori nei campi.");
    			 }
    		}
    	}
    }

  8. #8
    Utente di HTML.it L'avatar di @DI3GO@
    Registrato dal
    Nov 2008
    Messaggi
    537
    Come detto da andbin è uno strumento potente ( e parecchio ), quindi dai una bella lettura quin

    Sun Tutorial Regex

    Dovrebbe esserci tutto quello che vuoi sapere e più!
    Nipote: persona incompetente, con le soli doti di "copia/incolla" e la creazione automatica di siti internet ed interfaccie grafiche.Compie lavori apparentemente qualificati e richiesta una modifica sparisce in quatemala con i pochi soldi ottenuti.[...] Fonte la Diegonzelli

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da F3aR07
    c'è la possibilità anche di leggere non solo int ma anche double come numeri con le espressioni?
    Le espressioni regolari trattano ovviamente solo testo e basta ... non "sanno" nulla di numeri interi ecc...
    Per un numero double una stringa di formato potrebbe essere "\\d+\\.\\d+" cioè uno o più digit, seguito da un punto, seguito da uno o più digit. Se vuoi poter gestire altre forme (es. quella scientifica) devi preparare un apposito pattern.

    Originariamente inviato da F3aR07
    codice:
    			 if (PatternRiga.matcher(linea).matches()) 
    			 {
    			        // corrisponde
    				 	String[] CampiPacco = linea.split(" ");
    				 	
    				 	for(int i = 0 ; i < CampiPacco.length ; i++)
    				 	{
    				 		System.out.print(CampiPacco[i]+ " ");
    				 	}
    				 	System.out.println();
    			 }
    Se vuoi fare uno split dopo aver verificato il formato con le regex, ok va bene (anche perché nel tuo caso le parti sono tutte separate da spazi). Ma sappi che se vuoi puoi anche ottenere le varie parti della stringa modificando leggermente la regex (mettendo dei gruppi con (....) ) ed usando group() di Matcher.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    16
    e se volessi prendere anche nomi?
    ad esempio della riga:

    Paolo Rossi 12

    non dovrebbe essere:
    Pattern PatternRiga = Pattern.compile("[a-zA-Z] [a-zA-Z] \\d+");

    purtroppo da errore.Ho sbagliato qualcosa?
    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.