Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    8

    [JAVA] Dato un file di testo ritornare un file di testo giustificato

    Salve a tutti,
    Sono nuovo nel mondo Java (ma non nella programmazione). Studio informatica all'università ed un esercizio mi chiede che dato un file di testo in input devo ritornare il file di testo però con testo giustificato. Ci sbatto la testa da una settimana perché sono arrivato a corso iniziato per problemi familiari e mi ritrovo a fare java già ad un livello avanzato rispetto a quello che sono io.

    Vi ringrazio infinitamente in anticipo.
    Spero possiate aiutarmi a capire.
    Grazie a tutti.

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Hai qualche dettaglio in più sull' esercizio ?
    Per testo giustificato io sono abituato a intendere righe della stessa lunghezza, ma non è chiaro come dovresti ottenerlo.
    Visto che parli di file di testo mi sembrerebbe strano dover considerare il tipo di carattere e il fatto che sia o meno a lunghezza fissa (sarebbe anche molto avanzato penso).

    Hai forse un'idea di quanti caratteri deve essere lunga ogni riga ?
    O pensi di dover aggiungere spazi fino a rendere tutte le righe della stessa lunghezza della maggiore? Avresti un'idea di come impostare queste soluzioni ?
    Detto così però pare tutto un po' fumoso, magari altri hanno idee migliori...

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    8
    Ciao, grazie per la risposta. Scrivo il testo (tradotto in italiano perchè è in inglese) dell'esercizio così possiamo capirci meglio:

    "L'obiettivo è quello di creare un programma che giustifichi un testo in blocco con un determinato numero di caratteri per riga, vale a dire, ogni linea ha esattamente il dato numero di caratteri.Il testo viene letto dallo standard input e stampato sullo standard output (file .txt). Prima linea del file input contiene la lunghezza data della linea (cioè, il numero di caratteri per linea); Questa linea non viene copiata nell'output. Se la prima riga non contiene un numero di caratteri, il programma stampa 'Errore' e termina.


    Ci sono le seguenti regole come formattare l'output. Le parole sono separate da bianco spazi. Per una rilevazione dello spazio bianco utilizzare il metodo Character.isWhitespace (char ch). La riga vuota (o più righe vuote o una linea con solo spazi bianchi) crea un separatore di paragrafo.

    In uscita, i paragrafi sono separati da una sola riga vuota. Vi è almeno uno spazio tra le parole. Se una linea particolare sarebbe più breve della lunghezza data, gli spazi sono riempiti equamente tra le parole. Se gli spazi non possano essere riempiti ugualmente, gli spazi aggiuntivi sono aggiunti uno per uno da sinistra. L'ultima riga di un paragrafo è giustificata a sinistra, vale a dire, non vi è esattamente un unico spazio tra le parole e la linea ha al massimo la lunghezza data. Se c'è una parola più lunga della data lunghezza della linea, allora la parola è stampata sulla propria riga e sovraccarica la lunghezza data. Se c'è una sola parola su una riga, allora è giustificato a sinistra.


    L'intera input non può adattarsi alla memoria. Una singola linea di output si adatta sempre alla memoria."

    Questo è il testo tradotto che mi si presenta. Purtroppo per me un pò molto confusionario. Tu che ne pensi? Come posso liberarmi da questo labirinto?
    Grazie mille

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Dedrha Visualizza il messaggio
    Scrivo il testo (tradotto in italiano perchè è in inglese)
    Forse era meglio se postavi quello in inglese. La traduzione è molto "maccheronica", tipo:

    L'intera input non può adattarsi alla memoria. Una singola linea di output si adatta sempre alla memoria.
    Che senza contestualizzare/precisare ... non ha senso e vuol dire proprio niente.


    Comunque, ecco i punti chiari:
    - c'è una riga iniziale che indica il numero di caratteri per la giustificazione
    - ci sono "paragrafi" separati da righe vuote
    - l'ultima riga di un paragrafo non deve essere giustificata
    - la logica della giustificazione è di inserire spazi tra le parole partendo da sinistra, finché si arriva al limite richiesto
    - se una parola fa "sforare" la lunghezza, la si lascia così anche se va oltre la lunghezza

    Detto questo, i tuoi dubbi a che livello sono?

    Sono a livello di comprensione del testo?
    Sono a livello di ragionamento sull'algoritmo da implementare?
    Sono a livello "tecnico" (non sai come leggere da standard-input, non conosci Scanner, BufferedReader e altre classi di I/O, non sai come spezzare stringhe, ecc...)?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Con il testo è più chiaro, la mia idea di sapere quanti caratteri fosse lunga ogni riga non era così lontana

    Oltre ai punti che ha specificato andbin per me non è chiarissimo dal testo cosa deve succedere quando una riga è più lunga di quella iniziale.
    Il testo dice una parola, ed è chiaro che se accade la tieni così com'è (nel senso se una riga con una sola parola per assurdo fosse più lunga della prima).
    Ma se una riga con più parole ha la lunghezza maggiore, pare chiaro che la parola che fa sforare la lasci intatta (non vai a capo), ma non è chiaro cosa fare delle eventuali successive.
    Le "aggreghi" alla linea successiva ? O, visto che sembra tu debba mantenere la separazione tra le righe, crei una seconda riga solo con le parole in eccesso (eventualmente più righe se non ne basta solo una), e "abbassi di una riga " tutte le successive ?

    Comunque a parte questo e altri eventuali problemi sulla formattazione del testo , io ti consiglierei di non preoccuparti adesso della lettura/scrittura su file, ma di partire con stringhe create da te e capire come risolvere la giustificazione, provando caso per caso a scrivere il codice (ad esempio il caso della linea più corta è il primo che potresti risolvere).

    Se hai altri dubbi, come diceva andbin, specificali tutti

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    per me non è chiarissimo dal testo cosa deve succedere quando una riga è più lunga di quella iniziale.
    In effetti questo è un aspetto critico/dubbio e non c'è una sola soluzione (a seconda di cosa si vuole ottenere visivamente). Inoltre bisognerebbe capire cosa si deve fare se ad esempio una riga ha poche parole o comunque è MOLTO più corta della lunghezza di giustificazione. In questo caso non ha granché senso tentare di inserire un mucchio di spazi, perché parole molto spaziate generalmente stanno "male".

    Esempi (testo preso da Wikipedia; limite 80 caratteri; la barra indica il limite ovvero il carattere che è già "fuori")

    CASO 1
    codice:
    In informatica la programmazione orientata agli oggetti (OOP, Object Oriented   |
    Programming) è un paradigma di programmazione che permette di definire oggetti  |
    software in grado di interagire gli uni con gli altri attraverso lo scambio di  |
    messaggi.                                                                       |
    In questo caso basta inserire pochi spazi:
    codice:
    In  informatica  la  programmazione orientata agli oggetti (OOP, Object Oriented|
    Programming)  è  un paradigma di programmazione che permette di definire oggetti|
    software  in  grado di interagire gli uni con gli altri attraverso lo scambio di|
    messaggi.                                                                       |


    CASO 2
    codice:
    In informatica la programmazione orientata agli oggetti (OOP, Object Oriented Programming)
    è un paradigma di programmazione che permette di definire oggetti software in   |
    grado di interagire gli uni con gli altri attraverso lo scambio di messaggi.    |
    Questo caso è ancora semplice, la prima riga "sfora" ma di una sola parola. La si può lasciare lì (come anche indicato nel testo dell'esercizio).
    codice:
    In informatica la programmazione orientata agli oggetti (OOP, Object Oriented Programming)
    è  un  paradigma  di programmazione che permette di definire oggetti software in|
    grado di interagire gli uni con gli altri attraverso lo scambio di messaggi.    |


    CASO 3
    codice:
    In informatica la programmazione orientata agli oggetti                         |
    (OOP, Object Oriented Programming) è un paradigma di programmazione             |
    che permette di definire oggetti software in grado di interagire                |
    gli uni con gli altri attraverso lo scambio di messaggi.                        |
    Scenario dubbio: che si fa? Si inseriscono un mucchio di spazi? O si fa "fluire" tutto il testo portando su del testo dalle righe seguenti?
    a)
    codice:
    In      informatica     la     programmazione     orientata     agli     oggetti|
    (OOP,   Object   Oriented   Programming)   è   un  paradigma  di  programmazione|
    che   permette   di   definire   oggetti   software   in   grado  di  interagire|
    gli uni con gli altri attraverso lo scambio di messaggi.                        |
    oppure
    b)
    codice:
    In  informatica  la  programmazione orientata agli oggetti (OOP, Object Oriented|
    Programming)  è  un paradigma di programmazione che permette di definire oggetti|
    software  in  grado di interagire gli uni con gli altri attraverso lo scambio di|
    messaggi.                                                                       |


    CASO 4
    codice:
                                                                                    |
    In informatica la programmazione orientata agli oggetti (OOP, Object Oriented Programming) è un paradigma di programmazione che permette
    di definire oggetti software in grado di interagire gli uni con gli altri attraverso lo scambio di messaggi.
    Altro scenario dubbio: cosa si fa? Le righe sono molto più lunghe del limite. Si spezza ogni riga lunga in più righe (senza contare il resto) e queste le si giustifica così come vengono?
    Oppure si fa "fluire" il testo di nuovo come nel caso 3b ?
    a)
    codice:
    In  informatica  la  programmazione orientata agli oggetti (OOP, Object Oriented|
    Programming)     è    un    paradigma    di    programmazione    che    permette|
    di  definire  oggetti  software  in  grado  di  interagire gli uni con gli altri|
    attraverso lo scambio di messaggi.                                              |
    oppure come 3b ?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    8
    Grazie per le risposte, sono stato dal professore per una maggiore spiegazione.
    La prima riga ha un intero "n" che mi serve a capire di quanti caratteri deve essere ogni stringa.

    Devo contare i caratteri appena arrivo al n-esimo carattere mando a capo però qui devo attenzionare se l'n-esimo carattere è all'inizio della parola, a metà o nel migliore dei casi alla fine della parola, e con ciò devo fare dei controlli (Caso migliore se l'n-esimo carattere è alla fine della parola quindi è perfetto; se cade a metà devo tornare indietro e mandare a capo tutta la parola; se cade all'inizio devo vedere se prima ha spazio o meno).

    Una volta sistemate queste cose devo sistemare gli spazi partendo da sinistra in modo tale da arrivare a n caratteri (cosa importante tab o doppi spazi devono essere visti come un solo carattere).

    Non so se mi sono spiegato bene
    Grazie mille per l'aiuto.

    Io sto provando a dividere il problemi in tante parti per capire punto per punto come fare, però ho non pochi problemi purtroppo.
    Grazie a tutti.

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ok per l'ulteriore requisito.

    Quote Originariamente inviata da Dedrha Visualizza il messaggio
    [...] se cade all'inizio devo vedere se prima ha spazio o meno).
    Cosa intendi esattamente con questa frase? Se il carattere n-esimo è il primo carattere di una parola penso sia ovvio che devi mandarla tutta a capo (rientra sempre nel caso "a-metà"). Se il carattere n-esimo è lo spazio inserito prima della parola, a maggior ragione la manderai tutta a capo... Boh forse ho capito male io.

    Quote Originariamente inviata da Dedrha Visualizza il messaggio
    (cosa importante tab o doppi spazi devono essere visti come un solo carattere).
    Il fatto che ci possano essere tab o spazi multipli complica un pochino le cose. Fossi in te per ora penserei al resto. Lo dico perché nel caso tu voglia "spezzare" la stringa nelle varie parole, se spezzi in base allo spazio singolo e ne trovi uno multiplo ottieni un risultato poco piacevole ... Quindi converrebbe usare un'espressione regolare per la divisione.

    Quote Originariamente inviata da Dedrha Visualizza il messaggio
    Io sto provando a dividere il problemi in tante parti per capire punto per punto come fare, però ho non pochi problemi purtroppo.
    Grazie a tutti.
    Se ora il problema ti è chiaro però dovresti incominciare a proporre tu delle soluzioni, che sia a livello di codice o di procedimento da seguire. Comincia a "buttare giù" qualcosa (ovviamente chiedi sempre per altri problemi)

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2016
    Messaggi
    8
    Quote Originariamente inviata da Ansharja
    Cosa intendi esattamente con questa frase? Se il carattere n-esimo è il primo carattere di una parola penso sia ovvio che devi mandarla tutta a capo (rientra sempre nel caso "a-metà"). Se il carattere n-esimo è lo spazio inserito prima della parola, a maggior ragione la manderai tutta a capo... Boh forse ho capito male io.
    Hai capito benissimo. Il problema sorge quando l'n-esimo carattere cade a metà parola perché devo tornare indietro e troncare la riga prima dell'inizio della parola e sistemare gli spazi.


    Quote Originariamente inviata da Ansharja
    Il fatto che ci possano essere tab o spazi multipli complica un pochino le cose. Fossi in te per ora penserei al resto. Lo dico perché nel caso tu voglia "spezzare" la stringa nelle varie parole, se spezzi in base allo spazio singolo e ne trovi uno multiplo ottieni un risultato poco piacevole ... Quindi converrebbe usare un'espressione regolare per la divisione.
    Sisi ieri provando qualcosa ho pensato che si può risolvere con un'espressione regolare del tipo split("\\s+")


    Se ora il problema ti è chiaro però dovresti incominciare a proporre tu delle soluzioni, che sia a livello di codice o di procedimento da seguire. Comincia a "buttare giù" qualcosa (ovviamente chiedi sempre per altri problemi)
    Grazie io sto intanto a buttare giù qualche riga di codice per capire "a pezzi" come deve lavorare il programma. Intanto sto cercando di capire come leggere un intero da file e metterlo in una variabile intera (mi serve perché nella prima riga del file ho sempre un intero che mi indica la dimensione massima di ogni stringa).

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da Dedrha Visualizza il messaggio
    Hai capito benissimo. Il problema sorge quando l'n-esimo carattere cade a metà parola perché devo tornare indietro e troncare la riga prima dell'inizio della parola e sistemare gli spazi.
    Ok, "tornare indietro" comunque non è particolarmente complicato, dipende dal procedimento che seguirai.

    Quote Originariamente inviata da Dedrha Visualizza il messaggio
    Sisi ieri provando qualcosa ho pensato che si può risolvere con un'espressione regolare del tipo split("\\s+")
    Se sei già a questo punto sei pronto per partire . Non sono sicurissimo che un'espressione regolare che preveda gli spazi multipli funzioni sempre anche con il "tab". Ovviamente la tabulazione rappresenta spazi multipli, non so però se la codifica dia sempre il "match", in ogni situazione e piattaforma (non me intendo). Al massimo puoi cercare entrambi e sei sicuro che funzioni ...

    Quote Originariamente inviata da Dedrha Visualizza il messaggio
    Intanto sto cercando di capire come leggere un intero da file e metterlo in una variabile intera (mi serve perché nella prima riga del file ho sempre un intero che mi indica la dimensione massima di ogni stringa).
    Leggere da file dovrai sicuramente imparare a farlo per risolvere il problema. A mio parere non è la tua priorità però. Quando inizierai a scrivere l'algoritmo, dovrai sicuramente fare varie prove per correggere gli errori e vedere se funziona in ogni caso. Se ad ogni prova devi modificare il file da cui leggi e scrivere l'output sul file nuovo per vedere se funziona, perdi molto tempo per nulla, devi lavorare su file diversi, verificare che siano aggiornati, ed essere sicuro di non sbagliare la lettura/scrittura.

    Quindi io ti consiglierei di partire dichiarando tu un intero, es. numeroRighe, creare un vettore di stringhe che contenga delle ipotetiche righe di un file (in lettura è molto probabile che tu leggerai il file "a righe", ad esempio con BufferedReader) e partire a scrivere la soluzione.
    Una volta che funziona è un attimo generalizzare il tutto. Ovviamente è una tua scelta, se vuoi partire dalla lettura fai pure, secondo me però ci metterai di più

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.