Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    Utilizzo di StringTokenizer su un file

    Salve ho un problema con StringTokenizer;ho un file1.txt che contiene delle congiunzioni come(e,casomai,affinchè,come,ogni volta che,da che,siccome)ecc...e ho un'altro file2.txt che contiene testo.
    Ora il mio problema è se nel secondo file compaiono delle congiunzioni allora devo separarlo con StringTokenizer.
    Il codice che ho scritto e il seguente:
    codice:
    		BufferedReader cong=new BufferedReader(new InputStreamReader(new FileInputStream(file1.txt)));
    		BufferedReader file=new BufferedReader(new InputStreamReader(new FileInputStream(file2.txt)));
    		
    		String cng=cong.readLine();
    		String fl=file.readLine();
    
    while(fl!=null){
    		while(cng!=null){
    			StringTokenizer strcong=new StringTokenizer(cng,",");
    			while(strcong.hasMoreTokens()){
    				String congtmp=strcong.nextToken();
    				StringTokenizer strfile=new StringTokenizer(fl,congtmp);
    				while(strfile.hasMoreTokens()){
    					System.out.println(strfile.nextToken());
    				}}
    			cng=cong.readLine();
    }
    		fl=file.readLine();
    		}
    Ora il problema è:il programma preleva dal file1 con l'utilizzo si StringTokenizer le varie congiunzioni però quando legge nel file2 se trova la frase "ecco claudia stà tornando" mi torna in output cco\n claudia sta tornando ; perche trova la e in ecco sbagliando!
    Non riesco a capire come fare..Spero che riuscirete ad aiutarmi...Grazie 1000 anticipatamente

  2. #2
    Paticamente ragazzi in parole diverse..io devo vedere se nel mio file di testo sono presenti congiunzioni,se si devo dividerlo su vari token....però StringTokenizer se gli si dà in input la congiunzione e e nel testo trova case l'ha divide perche trova e finale di case...come potrei fare??? grazie ancora...

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nadiiia86
    Paticamente ragazzi in parole diverse..io devo vedere se nel mio file di testo sono presenti congiunzioni,se si devo dividerlo su vari token....però StringTokenizer se gli si dà in input la congiunzione e e nel testo trova case l'ha divide perche trova e finale di case
    Se parli di congiunzioni "e", "o" .... si presuppone ovviamente che esse siano separate dalle altre parole tramite spazi o segni di punteggiatura. In "Simone e Luca" ovviamente solo la 'e' in mezzo è una congiunzione ... mica la 'e' finale di Simone!!!

    Ma questo vuol dire che non puoi trattare banalmente le congiunzioni come "delimitatori" per StringTokenizer.... StringTokenizer non "sa" che tu vuoi solo le congiunzioni!

    Puoi ancora usare StringTokenizer ma devi prima separare tramite spazi/segni di punteggiatura. E poi vai a cercare se c'è un token "e" "o" ....

    "Simone e Luca" ---> 3 token "Simone" "e" "Luca". E in tal caso la parola "e" è la tua congiunzione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Originariamente inviato da nadiiia86
    Paticamente ragazzi in parole diverse..io devo vedere se nel mio file di testo sono presenti congiunzioni,se si devo dividerlo su vari token....però StringTokenizer se gli si dà in input la congiunzione e e nel testo trova case l'ha divide perche trova e finale di case...come potrei fare??? grazie ancora...
    come ti dice andbin, la cosa non è semplice da fare con StringTokenizer
    Credo ti convenga utilizzare un'espressione regolare per farlo (non conosco bene Java, quindi parlo in via generica), del tipo

    [ ,\n\t]+[eo][ ,\n\t]+

    per fare un esempio banale.

    edit: ovviamente, ottenendo gli indici dalla ricerca, puoi splittare la stringa


  5. #5
    Per completezza, ti posto la soluzione che ti ho proposto, piuttosto semplice grazie alla classe Pattern e al metodo split:

    Codice PHP:
    import java.util.regex.Pattern;

    class 
    Splitter
    {
        public static 
    void main(String[] argv)
        {
            
    String text "Massimo    e   Giovanni\to Luca";
            
    Pattern pattern Pattern.compile("[, \n\t]+[eo][, \n\t]+");
            
    String[] splitted pattern.split(text);
            
            for(
    String ssplitted)
                
    System.out.println(s);
        }

    \n e \t sono ovviamente il carattere newline e il carattere tab.

  6. #6
    Ok grazie per l'Input...il problema è che non ho mai usato questa classe e nemmeno le espressioni regolari,ho letto la giuda Java 2 PlatForm ma non ci ho capito molto....

  7. #7
    Se vuoi usare questo sistema non puoi fare altro che studiare le espressioni regolari da qualche parte (tra l'altro possono tornarti utili in futuro, essendo uno strumento molto potente), per essere sicura di non usarle alla cieca.

    Posso solo dirti che l'espressione regolare dell'esempio

    codice:
    [, \n\t]+[eo][, \n\t]+
    denota un linguaggio con 1 o più simboli presi nell'insieme {',', ' ', '\n', '\t'} (cioè virgola, spazio, tab e newline), seguiti da un simbolo che può essere 'e' oppure da 'o', seguito da 1 o più simboli nell'insieme {',', ' ', '\n', '\t'}.

    Le parentesi quadre dicono "uno qualsiasi dei simboli qui dentro" e il '+' indica "1 o più ricorrenze del simbolo precedente".

    Una stringa del linguaggio è ad esempio:

    '\t \n e, \t"

    Ovviamente l'espressione regolare la modificherai in modo da renderla utilizzabile nel tuo esempio.

    Qui trovi la descrizione della classe Pattern


  8. #8
    Scusate se ancora sono qui...ma i miei problemi con le espressioni regolari non sono finiti!
    Ho cercato di capirle però senza molti risultati..comunque il problema è:io ho un'array che contiene tutte congiunzioni,ora devo vedere se nel mio testo sono presenti delle congiunzioni.
    Ho modificato il codice in questo modo ma mi lancia un'eccezzione:java.util.regex.PatternSyntaxExcepti on
    codice:
    file=fd.readLine();
    String[] splitted=null;
    	 	while(filel!=null){
    	 		for(int i=0;i<arr.length;i++){
    	 		Pattern pattern = Pattern.compile("[ \n\t]+${arr[$i]}[ \n\t]+");
    	 		splitted = pattern.split(fl);
    	 		}
    	 		for(String s: splitted)
    	            System.out.println(s);
    file=fd.readLine();
    }
    arr è il mio array di stringe contenente tutte le congiunzoni della lingua italiana,come devo creare l'espressione regolare per far capire che arr è un'array contenente le varie congiunzioni e non una parola??????
    PS:Inoltre come faccio ad inserire che deve prendere in considerazione oltre che alle congiunzioni anche il segno della virgola??????
    Grazie 10000 anticipatamente

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da nadiiia86
    Pattern pattern = Pattern.compile("[ \n\t]+${arr[$i]}[ \n\t]+");
    Se pensavi che usando in una stringa una sintassi ${....} o $x per "iniettare" un valore nella stringa (come succede in altri linguaggi/ambienti) ...... è sbagliato!! In Java questo non esiste e non funziona.

    E la stringa quindi non rappresenta una regex corretta.

    Originariamente inviato da nadiiia86
    come devo creare l'espressione regolare per far capire che arr è un'array contenente le varie congiunzioni e non una parola??????
    Facciamo così, parti da questo codice:

    codice:
    import java.util.regex.*;
    
    public class Prova {
        public static void main(String[] args) {
            String[] congiunzioni = { "e", "o" };
    
            String testo = "JButton e JLabel sono componenti, entrambi di Swing. Sono usabili in applet o applicazioni.";
    
            Pattern pattern = Pattern.compile("[^ \n\t,.;:]+");
            Matcher matcher = pattern.matcher(testo);
    
            while (matcher.find()) {
                String parola = matcher.group();
    
                System.out.println("Parola [" + parola + "]  start=" +
                                   matcher.start() + " end=" + matcher.end());
            }
        }
    }
    La regex è molto semplice e non cerca parole specifiche. Invece cerca una sequenza contigua di caratteri che non contiene i separatori e i segni di punteggiatura. E quindi in pratica, vedendolo al contrario, trova le singole parole!

    Fai girare l'esempio e guarda gli indici start/end che stampa. Data una parola a te basta vedere se è una di quelle nell'array congiunzioni. Determinato che è una congiunzione, ti basta solo ragionare sugli indici per prendere le parti di testo tra le congiunzioni.

    P.S.: ovviamente non è completo, non ho usato l'array congiunzioni .... questo spetta a te farlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Ok l'ho compilato e ho letto un pò la documentazione su Matcher,però evete creato l'array congiunzioni:< String[] congiunzioni = { "e", "o" };>
    adesso come fate ad usarlo nell'espressione regolare per trovare le congiunzioni nel testo "JButton e JLabel sono componenti, entrambi di Swing. Sono usabili in applet o applicazioni.";"???...perchè il mio problema è appunto questo...ancora Grazie 1000

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.