Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    216

    [Java] contatore di caratteri,parole,righe

    Devo realizzare un programma che chieda all'utente il nome di un file e che visualizzi il numero di caratteri, parole e righe del file; il tutto corredato da eccezioni

    Non capisco come gestire il probolema. Avevo pensato ad una classe che fornisce diversi metodi, uno per contare le righe, uno per le parole e un altro per i caratteri.

    Siccome devo leggere più volte il testo avevo pensato di fare una prima scansione di tutto il file e memorizzare le info lette in un vector. Ma cosa devo conservare? Righe,parole o i singoli caratteri? Voi come fareste?

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

    Re: [Java] contatore di caratteri,parole,righe

    Originariamente inviato da raff5184
    Avevo pensato ad una classe che fornisce diversi metodi, uno per contare le righe, uno per le parole e un altro per i caratteri.

    Siccome devo leggere più volte il testo avevo pensato di fare una prima scansione di tutto il file e memorizzare le info lette in un vector.
    Se non ci sono altri motivi o altri requisiti particolari che ovviamente non posso conoscere, allora ti dico subito che non devi necessariamente leggere il file più volte e nemmeno devi avere per forza più metodi per gestire i singoli conteggi.

    Ti basta leggere il file "a righe" (ad esempio con readLine() di BufferedReader) e con ogni riga ovviamente conteggi già le righe e poi analizzi la stringa della riga per determinare gli altri dati, cioè numero di caratteri e numero di parole. Per i caratteri non so se intendi che siano compresi tutti i caratteri (nel qual caso basta un length()) e per le parole non hai specificato quali siano i possibili separatori delle parole (solo spazi?). Comunque basta usare un StringTokenizer.

    Per il "design" delle classi potrei consigliarti di fare una classe che non ha nulla a che fare con l'I/O ma che si occupa solamente di rappresentare e gestire i dati del conteggio. Avrebbe 3 proprietà (i contatori) e i soliti metodi getter per leggerli dall'esterno. Poi potrebbe avere un metodo es. analizzaRiga(String riga) che analizza la riga e aggiorna i 3 contatori.

    Il resto, input del nome del file, gestione dell'I/O potresti farlo in una classe principale, quella che hai il main.
    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
    Dec 2005
    Messaggi
    216

    Re: Re: [Java] contatore di caratteri,parole,righe

    Originariamente inviato da andbin
    Se non ci sono altri motivi o altri requisiti particolari che ovviamente non posso conoscere
    no è tutto qui

    andbin
    Ti basta leggere il file "a righe" (ad esempio con readLine() di BufferedReader)
    ok, io avevo pensato a due oggetti Scanner, in modo da fare una cosa del genre (contatori a parte)

    scan2.next(scan1.nextLine()); è poco elegante una soluzione di questo tipo?
    andbin
    Per i caratteri non so se intendi che siano compresi tutti i caratteri
    non è specificato, infatti non so nemmeno io se considerare anche gli spazi

    andbinnel qual caso basta un length()
    ecco non ci avevo pensato!!!

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

    Re: Re: Re: [Java] contatore di caratteri,parole,righe

    Originariamente inviato da raff5184
    ok, io avevo pensato a due oggetti Scanner, in modo da fare una cosa del genre (contatori a parte)

    scan2.next(scan1.nextLine()); è poco elegante una soluzione di questo tipo?
    Ma perché 2 Scanner??? Io ho detto che basta leggere il file 1 volta sola, in modo "lineare" e riga per riga.

    E ho anche suggerito di creare una classe apposita dedicata alla sola gestione dei contatori. In pratica di "incapsulare" la logica di conteggio.
    Anche se potrebbe sembrarti superfluo fare una classe apposita solo per gestire i vari contatori, non lo è.
    Incapsulare qualcosa significa anche sostanzialmente separare quel qualcosa dalle altre parti del software. E generalmente è solo un bene.
    Concetti come "incapsulazione", "coesione" e altri sono fondamentali.
    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
    Dec 2005
    Messaggi
    216
    duque per le classi che mi hai proposto sono d'accordo con te, sono quelle che avevo pensato anche io, perciò non ho replicato.

    Mi rendo conto dell'errore concettuale relativo ai 2 scanner.. però mi blocco dopo lo scan.nextLine(); perché a questo punto non ho capito come mi consigli di contare i token.. sse è possibile evitando lo StringTokenizer

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da raff5184
    Mi rendo conto dell'errore concettuale relativo ai 2 scanner.. però mi blocco dopo lo scan.nextLine(); perché a questo punto non ho capito come mi consigli di contare i token.. sse è possibile evitando lo StringTokenizer
    Nella classe che gestisce i contatori, come ho detto puoi mettere un metodo es. analizzaRiga(String riga) per analizzare la riga e aggiornare i contatori.
    Già il fatto di passare una riga, è una riga in più e quindi il contatore delle righe va banalmente incrementato di 1.
    Per numero di caratteri e numero di parole, è da valutare cosa vuoi fare. Se non puoi/vuoi (per qualunque motivo) usare classi/metodi appositi del framework (StringTokenizer, split(), regex o altro), allora la soluzione è il "parsing" della stringa "a mano".

    Immaginiamo di voler separare le parole solo dagli spazi. Nulla di complicato, basta una semplice "macchina a stati" con soli 2 stati: 0 e 1 (o false/true, false = fuori dalla parola, true = dentro la parola).

    Classico ciclo for per scansionare i singoli caratteri di una stringa uno per uno, charAt(i) per leggere il carattere e poi tieni una variabile che indica uno stato:

    codice:
    "  ciao come va  "
     0011110111101100
    Se sei in stato 0, se trovi spazio rimani in stato 0, se trovi un non-spazio passi a stato 1.
    Se sei in stato 1, se trovi spazio passi a stato 0, se trovi un non-spazio resti in stato 1.

    Il passaggio da 0 a 1 indica l'inizio di una parola, quindi incremento del contatore.

    Per il numero di caratteri, se vuoi contare tutti i caratteri, allora è sufficiente length() e basta. Se invece volessi solo contare i caratteri delle parole, allora conteggi tutti i caratteri che trovi quando sei in stato 1.
    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
    Dec 2005
    Messaggi
    216
    perfetto ho capito.. Un'ultima cosa e poi non ti rompo più.
    Con lo StringTokenizer devo poi invocare il metodo countTokens()?... altrimenti non vedo il vantaggio rispetto al doppio scanner...


    Comunque, ancora una volta grazie e buonanotte

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da raff5184
    Con lo StringTokenizer devo poi invocare il metodo countTokens()?
    Se non devi fare altro con le parole (es. contare i caratteri delle parole) allora basta che invochi countTokens() e sai già quante parole (token appunto) ci sono.
    Se invece dovessi conteggiare i caratteri solo nelle parole, allora dovresti comunque fare il solito ciclo che usa hasMoreTokens()/nextToken().

    Originariamente inviato da raff5184
    ... altrimenti non vedo il vantaggio rispetto al doppio scanner...
    Continuo a non capire a cosa ti servirebbe un doppio scanner .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.