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

    Inserire stringhe in una lettera

    Come al solito ho cercato qualcosa in cerca ma non ho trovato niente (mi sa che so interdetto io con il tasto di ricerca ><).
    Vi espongo il mio problema:
    L'esercizio mi chiede di progettare una classe per impaginare una semplice lettera. Il costruttore riceve come parametri il nome del mittente e quello del destinatario, progettare un metodo per aggiungere una riga di testo al contenuto della letterea e un metodo che restituisca l'intero testo della lettera.
    Il testo della lettera ha il seguente formato:
    Dear destinatario:
    riga vuota
    prima riga del contenuto della lettera
    seconda riga del contenuto della lettera
    ...
    ultima riga del contenuto della lettera
    riga vuota
    Sincery,
    riga vuota
    mittente.

    Io ho fatto cosi:
    package cap3;
    /**
    *
    * Impagina una lettere, ne aggiunge righe di testo e mostra il contenuto della lettera
    *
    */
    public class Letter
    {
    /**
    * Impagina una lettera
    * @param nmittente il nome del mittente
    * @param ndestinatario il nome del destinatario
    */
    public Letter(String nmittente, String ndestinatario)
    {
    mittente = ("Dear " + nmittente + "\n" + "\n");
    destinatario = ("\n" + "\n" + "Sincery, " + "\n" + "\n" + ndestinatario);
    Lettera = "";
    }

    /**
    * Aggiunge una riga di testo alla lettera
    * @param line testo da aggiungere alla lettera
    */
    public void addLine(String line)
    {

    Lettera = mittente + line + destinatario;

    }

    /**
    * Identifica l'intero contenuto della lettera
    * @return Lettera contenuto della lettera
    */
    public String getText()
    {
    return Lettera;
    }

    private String mittente;
    private String destinatario;
    private String Lettera;
    }

    solo che se provo ad aggiungere piu righe il programma semplicemente mi sovrascrive il testo e non lo aggiunge alla prossima riga, ad esempio se scrivo questo programma di collaudo:

    package cap3;

    public class LetterTester
    {
    public static void main(String[] args)
    {
    Letter lettera = new Letter("John", "Mary");
    lettera.addLine("Im sorry we must part.");
    lettera.addLine("I wish you all the best");
    System.out.println(lettera.getText());

    }

    }

    mi restituisce:
    Dear John

    I wish you all the best

    Sincery,

    Mary

    Come posso fare per ottenere il risultato sperato? e cioe aggiungere semplicemente piu righe? Grazie anticipatamente per le risposte.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Innanzitutto una questione non tecnica: ciò che si mette dopo "Dear" è il destinatario e al fondo dopo "Sincerely" si mette il mittente.

    Dal punto di vista tecnico ci sono 2 questioni: il problema principale è che devi aggiungere linee in mezzo, perché c'è la parte che deve sempre stare al fondo. Per risolvere la cosa si possono gestire 3 variabili String di istanza da tenere separate: una per la parte iniziale, una per la parte finale e l'ultima a cui accodi di volta in volta le linee.
    Solo quando ti viene invocato getText() allora ritorni una stringa che è l'unione delle 3 variabili.
    Altrimenti accodi la linea solo nella variabile dedicata al testo vero e proprio della lettera.

    Inoltre i newline bisogna vedere se devi metterli in stile Unix (come hai fatto) o in base alla piattaforma su cui sta "girando" l'applicazione (che sarebbe meglio).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Mentre aspettavo la risposta ho trovato questa soluzione:
    package cap3;
    /**
    *
    * Impagina una lettere, ne aggiunge righe di testo e mostra il contenuto della lettera
    *
    */
    public class Letter
    {
    /**
    * Impagina una lettera
    * @param nmittente il nome del mittente
    * @param ndestinatario il nome del destinatario
    */
    public Letter(String nmittente, String ndestinatario)
    {
    mittente = ("Dear " + nmittente + "\n" + "\n");
    destinatario = ("\n" + "\n" + "Sincery, " + "\n" + "\n" + ndestinatario);
    contenuto = "";
    Lettera = mittente + destinatario;
    }

    /**
    * Aggiunge una riga di testo alla lettera
    * @param line testo da aggiungere alla lettera
    */
    public void addLine(String line)
    {
    contenuto = contenuto.concat(line).concat("\n");
    Lettera = mittente + contenuto + destinatario;
    }

    /**
    * Identifica l'intero contenuto della lettera
    * @return Lettera contenuto della lettera
    */
    public String getText()
    {
    return Lettera;
    }

    private String mittente;
    private String destinatario;
    private String Lettera;
    private String contenuto;
    }

    Solo che diciamo ho barato un pò mettendo dear e sincerily nelle variabili, però non capivo altrimenti come fare a metterli prima. (il mittente e destinatario già li ho confusi lol).
    Come faccio a metterli in base ad una generica piattaforma?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    La tua soluzione tecnicamente va bene ma si può comunque migliorare/ottimizzare. Intanto basta notare che la variabile Lettera è superflua. Sarebbe sufficiente concatenare e quindi restituire mittente+contenuto+destinatario solo quando viene invocato getText(). E in tal caso arriveresti proprio alla soluzione che dicevo io prima.

    Ma si potrebbe migliorare e ottimizzare ancora di più sfruttando opportunamente la classe StringBuffer o StringBuilder. Essendo questo, come hai detto all'inizio, un esercizio non so se puoi usare tali classi e oltretutto se le conosci.

    Visto che la parte che cambia ad ogni aggiunta di una linea è solo il contenuto e non le due stringhe di testa/coda, si potrebbe usare un StringBuffer/StringBuilder per il contenuto. Accodare una stringa in uno di queste due classi è molto più pratico ed efficiente.

    Ma ci sarebbe ancora un'ulteriore soluzione più estrema. Usare un StringBuffer/StringBuilder per tutta l'intera lettera. Inizialmente metti nel StringBuffer testa+coda. Quando devi inserire qualcosa, lo inserisci non al fondo (ovviamente) ma bensì ad un offset che è la lunghezza dello StringBuffer meno la lunghezza della coda.

    Per quanto riguarda i newline, scrivere esplicitamente '\n' non è il massimo. Dovresti usare ciò che ti fornisce la property di sistema "line.separator":

    String newline = System.getProperty ("line.separator");
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok grz davvero delle spiegazioni sei stato chiarissimo, anche se non posso usare quelle 2 classi in questo esercizio mi torneranno senz'altro utili in fututo grazie mille.

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.