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

    Memorizzare valori in array di stringhe

    Ciao ragazzi,

    ho un problema con il salvataggio dei valori string richiesti in input all'utente.
    Tramite un ciclo for chiedo all'utente quanti valori stringa vuole inserire, salvo tutti i valori in un array di stringhe.
    Il problema si presenta quando l'utente tramite il menu richiede nuovamente di inserire i valori, infatti quelli precedenti vengono poi sostituiti dai nuovi che sono stati inseriti. Vi faccio un esempio:

    =====================

    Quanti valori vuoi inserire? : 2
    Inserisci 1° valore: casa
    Inserisci 2° valore: cane

    MENU CON SCELTE

    1. Inserisci valori
    2. Visualizza valori
    3. Termina programma

    clicco su visualizza valori

    Hai inserito: casa, cane

    MENU CON SCELTE...

    clicco su inserisci valori

    Quanti valori vuoi inserire? : 1
    Inserisci 1° valore: ciao

    MENU CON SCELTE..

    clicco su visualizza valori

    Hai inserito: ciao

    =======================

    Come mai i nuovi valori vengono sostituiti ai precedenti?

    Come faccio a memorizzarli in maniera definitiva fin quando l'utente non sceglie di terminare l'applicazione?
    ?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da wormd Visualizza il messaggio
    Tramite un ciclo for chiedo all'utente quanti valori stringa vuole inserire, salvo tutti i valori in un array di stringhe.
    Il problema si presenta quando l'utente tramite il menu richiede nuovamente di inserire i valori, infatti quelli precedenti vengono poi sostituiti dai nuovi che sono stati inseriti. Vi faccio un esempio:

    Come mai i nuovi valori vengono sostituiti ai precedenti?
    Dopo che hai chiesto "Quanti valori vuoi inserire?" e l'utente ha inserito il numero, immagino che istanzi un array di String con quella dimensione.
    Se ripeti da capo questa procedura .... ovviamente crei un nuovo array e il vecchio array buonanotte .....

    Quote Originariamente inviata da wormd Visualizza il messaggio
    Come faccio a memorizzarli in maniera definitiva fin quando l'utente non sceglie di terminare l'applicazione?
    Se vuoi aggiungere sempre, la soluzione più pulita e pratica è usare una collezione (List). Se non ti è permesso o non vuoi usare una collezione, quando l'utente ripete la procedura di inserimento fai così (uso il tuo esempio): la seconda volta che l'utente chiede di inserire 1 elemento, prima ce n'erano già 2. Istanzi un nuovo array di 3 elementi e ricopi i primi 2 nel nuovo. Quindi parti dal nuovo indice (2).

    EDIT, possiamo anche generalizzare se vuoi: se prima l'array era di N elementi e ora l'utente vuole inserirne altri M, allora istanzi un nuovo array di lunghezza N+M, ricopi i primi N elementi e poi parti ad assegnare nell'array partendo dall'indice di valore proprio N.
    Ultima modifica di andbin; 02-04-2014 a 12:51
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Semplicemente il numero di valori mi serve per il ciclo for, il ciclo lo ripete n volte a seconda del valore inserito dell'utente.
    Dopo che ho richiesto quanti valori voglia inserire l'utente comincio il ciclo for e gli passo il primo valore di lettura così:

    valore[i] = br.readLine();

    avevo provato anche con += ma poi concatenava tutto, anche se salvava tutti valori senza sostituire i vecchi.
    ?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ok e quale è il dubbio ora? Non è chiara la mia spiegazione generalizzata che ho fatto nel EDIT?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ok e quale è il dubbio ora? Non è chiara la mia spiegazione generalizzata che ho fatto nel EDIT?
    No, tu sei sempre esaustivo
    Sono un po' confuso su come interagire con la soluzione. L'array list usa il metodo add per aggiungere un valore e dovrei creare una nuova variabile da cui leggere in input.
    Comunque ecco come inserisco i valori:

    codice:
    System.out.print("Quanti valori vuoi inserire?: ");
        try
        {
        max = Integer.parseInt(br.readLine());
        }catch(NumberFormatException e)
        {
        System.err.println("Inserisci un numero!");
        max = Integer.parseInt(br.readLine());
        }
        
        for(int i = 0; i < max; i++)
        {
            System.out.println("Inserisci " + (i+1) + "° valore: ");
            try
            {
            valore[i] = br.readLine();
            }catch(IndexOutOfBoundsException e)
            {
                System.err.println("Non c'è più spazio in memoria!");
            }
        }
    è proprio in valore[i] = br.readLine(); che devo mettere mano giusto? Ho fatto come hai detto e ho stanziato l'array prima ancora di aprire il metodo, dando una capacità di memorizzazione massima di 20 elementi.
    Continuo a non capire però come faccio a salvare tutti i valori precedentemente letti e nuovi.
    ?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da wormd Visualizza il messaggio
    No, tu sei sempre esaustivo


    Quote Originariamente inviata da wormd Visualizza il messaggio
    Sono un po' confuso su come interagire con la soluzione.

    è proprio in valore[i] = br.readLine(); che devo mettere mano giusto? Ho fatto come hai detto e ho stanziato l'array prima ancora di aprire il metodo, dando una capacità di memorizzazione massima di 20 elementi.
    Continuo a non capire però come faccio a salvare tutti i valori precedentemente letti e nuovi.
    Innanzitutto bisognerebbe vedere il "design" della tua classe/i. Spererei che, come minimo, tutto quello che stai facendo per interagire con l'utente lo fai nel contesto di una istanza della tua classe, in modo da poter tenere variabili di istanza come appunto per l'array.

    È sufficiente tenere "in vita", per la durata della applicazione, 2 cose:
    - un String[], inizialmente di lunghezza 0 (non nullo).
    - un int che indica il numero "logico" di elementi correnti e che fa anche da indice per il successivo inserimento, inizialmente a 0.

    Poi basta incapsulare la logica di espansione dell'array in un metodo es.

    private void espandiArray(int numeroAggiunti)

    Qui dentro la logica è semplice:
    - istanzi un nuovo array di lunghezza uguale alla dimensione corrente + numeroAggiunti.
    - ricopi i vecchi elementi. Basta un ciclo for o anche arraycopy di System che fa tutto.
    - assegni il nuovo array alla variabile di istanza.

    Il resto (ciclo di input) prosegue senza che debba sapere altro (a parte quel numero "logico" di elementi).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    per lo string l'ho dichiarato così:

    private String[] valori = new String[20];

    che è un array di stringhe di max 20 elementi.
    Per il numero logico ho dichiarato "i" nel ciclo for come hai potuto vedere.

    Tu passi ad un metodo numeroAggiunti come parametro ma io vorrei fare tutto nel metodo dove aggiungo, mi spiego meglio.
    Se l'utente vuole aggiungere inizialmente 5 elementi e poi di seguito altri 2, i precedenti 5 devono essere allocati ai nuovi 2 aggiunti senza "perderli", questo però lo voglio fare tutto nel metodo dove aggiungo senza creare un altro metodo e allargare l'incapsulamento della classe.
    È possibile fare questo? Oppure bisogna creare per forza un altro metodo come mi hai suggerito?
    ?

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Molto ... molto "abbozzato" io farei, ma come minimo proprio:

    codice:
    public class GestioneStringhe {
        private String[] elencoStringhe;
        private int numeroStringhe;
    
        public GestioneStringhe() {
            elencoStringhe = new String[0];
            numeroStringhe = 0;
    
            // altri setup es. BufferedReader per input ....
        }
    
        private void espandiArray(int numeroAggiunti) {
            // ..... qui la logica di espansione
        }
    
        public void menu() {
            // ..... gestione menù e scelta ....
        }
    
        private void inserisci() ...... metodi per le singole opzioni del menù ....
    
        ... altri eventuali metodi ....
    
    
        public static void main(String[] args) {
            GestioneStringhe gestione = new GestioneStringhe();
            gestione.menu();
        }
    }

    E volendo fare qualcosa di più del minimo "sindacale" come ho abbozzato, io incapsulerei la logica di gestione dell'array in una classe a sé stante.
    Ultima modifica di andbin; 02-04-2014 a 14:43
    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.