RISOLTO [Java] Inserimento elementi in un array

Stato
Discussione chiusa ad ulteriori risposte.

Lucym80

Nuovo Utente
12
2
Salve a tutti, mi sto da poco avvicinando al mondo Java e non avendo basi di programmazioni sto incontrando alcune dificoltà che pian piano sto provando a risolvere.
Sto creando una sorte di archivio dove l'utente può aggiungere i nomi dei suoi artisti preferiti, con data di nascita e biografia, ma sto avendo dificoltà.
Ho creato una variabile i, che tiene traccia dei nomi inseriti e un'altra x, che dovrebbe contare quanti elementi sono stati inseriti, per far si che quando inserisco il secondo artista non mi vada a sovrascrivere il primo, ma sicuramente non funziona così, perché il programma parte, inserisco i dati, ma quando dico di mostrarmi gli artisti inseriti mi dà errore:
potete aiutarmi a capire con qualche esempio dove sbaglio?
Non è che voglio l'esempio solo per poterlo trascrivere nella classe, anzi vi sarei grata che mi spiegasse anche passo passo ciò che mi correggete, in modo da memorizzare bene il codice e riuscire a metterlo insieme meglio le prossime volte.
Spero di essermi spiegata bene.
Vi incollo le classi.
Prima classe:
Codice:
package EserciziJava.esercizio2;
public class Artista {
private String nome;
private String cognome;
private int dataDiNascita;
private String biografia;
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}
public String getCognome() {
    return cognome;
}
public void setCognome(String cognome) {
    this.cognome = cognome;
}
public int getDataDiNascita() {
    return dataDiNascita;
}
public void setDataDiNascita(int dataDiNascita) {
    this.dataDiNascita = dataDiNascita;
}
public String getBiografia() {
    return biografia;
}
public void setBiografia(String biografia) {
    this.biografia = biografia;
}
}
Seconda classe, qui sicuramente c'è l'errore.
Codice:
package EserciziJava.esercizio2;
import java.util.Scanner;
public class DatiArtista {
Artista [] artista = new Artista[100];
Scanner scanner =new Scanner(System.in);
String stringa ="";
public String creaArtisti(String stringa) {
    int i =0;
    while(stringa.equals("a")){
if (i<100) {
            artista = new Artista();            

            System.out.println("Inserisci nome");
            String nome = scanner.nextLine();
            artista.setNome(nome);            
            System.out.println("Inserisci cognome");
            String cognome = scanner.nextLine();
            artista.setCognome(cognome);
            System.out.println("Inserisci data di nascita.");
            String nascita = scanner.nextLine();
            int data = Integer.parseInt(nascita);            
            artista.setDataDiNascita(data);
System.out.println("Inserisci biografia");
            String biografia = scanner.nextLine();
            artista.setBiografia(biografia);
            i++;
System.out.println("Digita a per continuare a inserire gli artisti, b per visualizzare tutti gli artisti, oppure x per chiudere");
stringa = scanner.nextLine();        
}
int x =0;
while(stringa.equals("b")){
    if (x<100) {
                    x++;

            System.out.println(artista.getNome());
            System.out.println(artista.getCognome());
        System.out.println(artista.getDataDiNascita());
System.out.println(artista.getBiografia());
}
else {
    System.out.println("Attenzione! L'archivio risulta pieno!");
}
}
                }
                                    return stringa;
}
}
Terza classe, quella con il main.
Codice:
package EserciziJava.esercizio2;
import java.util.Scanner;
public class ApplicazioneArchivio {    
     public static void main(String args[] ) {
            DatiArtista datiartista = new DatiArtista();
        Scanner scanner = new Scanner(System.in);
        String stringa ="";
        System.out.println("Benvenuto nell'archivio dove puoi inserire tutti i dettagli dei tuoi artisti preferiti. Digita a per inserire gli artisti, b per visualizzare tutti gli artisti inseriti x se vuoi terminare il programma");
        stringa = scanner.nextLine();
        while(!stringa.equals("x")){
        stringa =datiartista.creaArtisti(stringa);
        }
        if(stringa.equals("x")){
            System.out.println("Ciao e alla prossima!");
        }                    
        }
    }
Ancora mille grazie!
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Ciao e benvenuto,
Per favore leggi il regolamento di sezione che e' nella lista delle discussioni in rilievo.
Devi postare il codice usando gli appositi TAG, oppure cliccando il bottone con i tre punti e con il menu a tendina.

Quello che stai facendo e' ovviamente un semplice database, ma per imparare va bene. Il problema e' nell'uso dei vettori, quando hai una collezione di variabili a lunghezza variabile e in cui devi inserire/aggiungere/modificare/cancellare elementi, i vettori non vanno assolutamente bene. Quello che devi usare sono appunto classi di tipo Collection o Dictionary, ogni linguaggio moderno ne ha a bizzeffe a seconda di come li si vuole usare, a seconda del bisogno.

Ovviamente se devi risolvere un esercizio e sei forzato a usare un vettore e' un altro paio di maniche. Prima quindi di iniziare una disquisizione facci sapere (e modifica il tuo messaggio)
 
  • Mi piace
Reazioni: Moffetta88

Lucym80

Nuovo Utente
12
2
Ciao, per le modifiche al messaggio, dicevi così? Chiedo scusa, ma non sapevo della regola. Riguardo al codice, sì, purtroppo non ho ancora visto le colection, si sta parlando solo degli array semplici per far capire il concetto, è stato solo accennato che in realtà poi useremo le colection: ecco perché l'esercizio l'ho fatto in questo modo. Grazie anticipatamente!
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
L'errore e' molto semplice, e mi pare strano che il compilatore non ti avvisi.
Hai definito un vettore Artista [] artista = new Artista[100]; ma non lo usi correttamente. artista e' un vettore, quindi accedi ai suoi elementi usando un indice, per esempio artista[0].GetNome(). Tu invece nel primo loop crei artista come una nuova classe, ogni volta.

Ci sono parecchi altri problemi, ma non conoscendo il tuo livello di conoscenza e' difficile descriverli.
 
  • Mi piace
Reazioni: Lucym80

Lucym80

Nuovo Utente
12
2
Ciao, prima di tutto grazie! Il mio livello è quasi zero, purtroppo sto apprendendo un bel po' in teoria, ma non in pratica: provo a farti un esempio: tu mi hai scritto quello che dovrei fare e l'ho capito, però non riesco a scriverlo in linguaggio Java, ecco perché chiedevo degli esempi pratici. Un altro esempio è questo: sapevo che si possono rimuovere degli elementi, perché mi è stato detto, ma non saprei da dove iniziare per farlo.
Grazie anticipatamente!
 

Andretti60

Utente Èlite
6,440
5,091
Non puoi eliminare gli elementi di un vettore, a meno di non creare un nuovo vettore e copiare gli elementi di un vettore dentro l'altro, scartando l'elemento che va cancellato. Ecco perche' dicevo che in questo caso e' meglio usare le liste invece dei vettori.
Nel tuo caso poiche' ogni elemento di un vettore e' una classe, puoi semplicemente cancellare quella classe e assegnare a quel elemento il valore null. Che rende le cose complicate quando aggiungi un nuovo elemento, perche' in quel caso devi scansionare il vettore finche' non trovi un null.

Per il resto ti stai sottovalutando :) Hai gia' scritto il codice che aggiunge e stampa il valore degli elementi, e' nel meotodo creaArtisti() (il codice va corretto ovviamente) Quello che devi fare e' creare due nuovi metodi (Aggiungi e Stampa) e poi fare quasi copia e incolla.

Quello che mi stupisce un po' e' che stai facendo un esercizio che include sia la manipolazione di un vettore che la creazioni di classi, le cose andrebbero fatte separatamente.
 

Lucym80

Nuovo Utente
12
2
Ciao, infatti mi è stato detto di provare ad aggiungere un nuovo vettore o comunque di scansionare l'intero array, ma non riesco a metterlo in pratica.
Tu scrivi:
Hai gia' scritto il codice che aggiunge e stampa il valore degli elementi, e' nel meotodo creaArtisti() (il codice va corretto ovviamente) Quello che devi fare e' creare due nuovi metodi (Aggiungi e Stampa) e poi fare quasi copia e incolla.
Devo copiare e lasciare anche quelli, ho devo inserire i nuovi metodi e inserire il codice che già c'è in quei metodi?
Poi hai scritto:
Quello che mi stupisce un po' e' che stai facendo un esercizio che include sia la manipolazione di un vettore che la creazioni di classi, le cose andrebbero fatte separatamente.
Cosa intendi?
Andrebbero scritti in due classi diverse?
A me è stato detto di suddividere l'esercizio in tre classi diverse, una con i vari metodi e variabili, l'altra con i vari iff eccetera e l'ultima solo con il main e i metodi di partenza.

Non è che mi sottovaluto, ma faccio ancora parecchia confusione, però le tue parole mi incoraggiano, perché vuol dire che qualcosa lo sto facendo!
Mille grazie!
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Guarda, progettare una gerarchia di classi e' la cosa piu' difficile da fare in OOP, quindi non ti buttare giu'. Mi pare che o non ti hanno insegnato o non hai imparato come si fa.

Occorre capire come organizzare i dati. Una classe non deve contenere solo i dati, ma anche i metodi per manipolarli.
Guarda per esempio questo codice che tu hai scritto:

Codice:
           artista = new Artista();
           System.out.println("Inserisci nome");
            String nome = scanner.nextLine();
            artista.setNome(nome);           
            System.out.println("Inserisci cognome");
            String cognome = scanner.nextLine();
            artista.setCognome(cognome);
            System.out.println("Inserisci data di nascita.");
            String nascita = scanner.nextLine();
            int data = Integer.parseInt(nascita);           
            artista.setDataDiNascita(data);
            System.out.println("Inserisci biografia");
            String biografia = scanner.nextLine();
            artista.setBiografia(biografia);

Che va bene, ma lo hai messo nella classe DatiArtista, il che significa che tutte le volte che vuoi creare una classe Artista lo devi riscrivere.
Sarebbe invece meglio inserirlo in un metodo della classe Artista stessa, tipo:

Codice:
class Artista
{
    private String nome;
    private String cognome;
    private int dataDiNascita;
    private String biografia;

    public void InserisciDaScanner(Scanner scanner)
    {
        System.out.println("Inserisci nome: ");
        nome = scanner.nextLine();
        System.out.println("Inserisci cognome: ");
        cognome = scanner.nextLine();
        System.out.println("Inserisci data di nascita: ");
        dataDinascita = Integer.parseIntscanner.nextLine());
        System.out.println("Inserisci biografia: ");
        biografia = scanner.nextLine();
    }
}

Passiamo adesso alla classe DatiArtista, che dovrebbe solo avere a che fare con la manipolazione del vettore dei dati.
Per esempio questo il codice per aggiungere un nuovo artista:

Codice:
Class DatiArtista
{
    private Artista[] artista;
    private int numArtisti;
    private int maxArtisti;
    
    public Artista()
    {
        maxArtisti = 100;
        numArtisti = 0;
        artista = new Artista[maxArtisti];
    }
    
    public void AddFromScanner(Scanner scanner)
    {
        if (numArtisti == maxArtisti)
            return;
        int i;
        for (i=0; i < maxArtisti; i++)
        {
            if (artista[i] == null)
            {
                Artista a = new Artista();
               // qui occorrerebbe un metodo che controlli che l'artista inserito non esista gia' 
                a.InserisciDaScanner(scanner);
                artista[i] = a;
                numArtisti += 1;
                break;
            }
        }
    }
}

E nota bene: e' solo un esempio. Come sempre non esiste sempre e solo un unico modo per scrivere un programma.
L'idea e' che le singole classi devono "nascondere" all'esterno i dettagli della implementazione. Oggi scrivi i dati un un vettore, domani puoi facilmente estendere la tua classe usando una lista, o un database, e devi cambiare SOLO una classe, tutto il resto continua a funzionare come se niente fosse. Questo e' lo scopo finale. E' uno dei quattro pilastri di base del OOP, ossia Incapsulamento.
 

Lucym80

Nuovo Utente
12
2
Ciao, direi che un po' sono io che faccio molta confusione e un po' tante cose soprattutto nel modo di come si scrive il codice non mi è stato detto.
Che la programmazione e soprattutto che Java è tosta, me ne sono accorta!
Infatti non sono una che si arrende facilmente, ma quasi quasi sto per farlo!
Ho provato a fare le modifiche come mi hai suggerito, ma credo di aver sbagliato qualcosa, perché adesso il programma parte, ma visualizzo solo il messaggio di benvenuto.
Ho lasciato le opzioni per stampare gli artisti eccetera ma non riesco a visualizzare nulla.
La stringa
dataDinascita = Integer.parseIntscanner.nextLine());
mi dava errore e l'ide che uso ha voluto modificarla.
Ti lascio il codice, così mi dici se ho fatto ancora più pasticci di prima!
Prima classe.
Codice:
package EserciziJava.esercizio2;

import java.util.Scanner;

public class Artista {
private String nome;
private String cognome;
private int dataDiNascita;
private String biografia;
public void InserisciDaScanner(Scanner scanner) {
System.out.println("Inserisci nome: ");
nome = scanner.nextLine();
System.out.println("Inserisci cognome: ");
cognome = scanner.nextLine();
System.out.println("Inserisci data di nascita: ");
dataDiNascita = scanner.nextInt();
System.out.println("Inserisci biografia: ");
biografia = scanner.nextLine();
Object stringa = null;
while(stringa.equals("a")){
System.out.println("Digita a per continuare a inserire gli artisti, b per visualizzare tutti gli artisti, oppure x per chiudere");
stringa = scanner.nextLine();

                
while(stringa.equals("b")){
                   
            System.out.println(nome + cognome + dataDiNascita + biografia);
}
}
}
        }
Seconda classe.
Codice:
private Artista[] artista;
            private int numArtisti;
            private int maxArtisti;
            public void Artista() {
            maxArtisti =100;
            numArtisti =0;
            artista = new Artista[maxArtisti];
            }
            public void AggiungiDaScanner(Scanner scanner) {
                if (numArtisti == maxArtisti)
                    return;
                int i;
                for (i=0; i < maxArtisti; i++) {
                    if (artista[i] == null) {
                        Artista a = new Artista();
                        a.InserisciDaScanner(scanner);
                        artista[i] = a;
                        numArtisti += 1;
                        break;
                    }
                            }
            }
}
Terza classe.
Codice:
P.S. Non è che non funziona perché manca il get e set?
Ho dovuto toglierli, poiché mi dava errore.
Mille grazie!
Post unito automaticamente:

Prova fatta! Ho fatto generare il get e set in automatico, ma comunque il programma parte allo stesso modo, visualizzo solo il messaggio di benvenuto.
Questa è la classe modificata con il get e set.
Codice:
package EserciziJava.esercizio2;

import java.util.Scanner;

public class Artista {
private String nome;
private String cognome;
private int dataDiNascita;
private String biografia;
public void InserisciDaScanner(Scanner scanner) {
System.out.println("Inserisci nome: ");
nome = scanner.nextLine();
System.out.println("Inserisci cognome: ");
cognome = scanner.nextLine();
System.out.println("Inserisci data di nascita: ");
dataDiNascita = scanner.nextInt();
System.out.println("Inserisci biografia: ");
biografia = scanner.nextLine();
Object stringa = null;
while(stringa.equals("a")){
System.out.println("Digita a per continuare a inserire gli artisti, b per visualizzare tutti gli artisti, oppure x per chiudere");
stringa = scanner.nextLine();

                
while(stringa.equals("b")){
                   
            System.out.println(nome + cognome + dataDiNascita + biografia);
}
}
}
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}
public String getCognome() {
    return cognome;
}
public void setCognome(String cognome) {
    this.cognome = cognome;
}
public int getDataDiNascita() {
    return dataDiNascita;
}
public void setDataDiNascita(int dataDiNascita) {
    this.dataDiNascita = dataDiNascita;
}
public String getBiografia() {
    return biografia;
}
public void setBiografia(String biografia) {
    this.biografia = biografia;
}
        }
Ancora grazie!
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Scusa ma non posso scrivere l'esercizio per te.
Io ti ho dato suggerimenti, quello che in inglese si dice "snippet", ossia solo parte del codice, devi essere poi tu a riempire i "buchi".
E poi stai facendo un casino immenso. Perche' mai hai messo quel
while(stringa.equals("a"))
all'interno del metodo InserisciDaScanner, che serve SOLO a inizializzare QUELLA classe? Una e basta. Tra l'altro istruzione inutile visto che la variabile stringa (nome orribile, ma lasciamo perdere) la hai inizializzata ma mai usata (quindi rimane sempre null)

Devi modificare il main(), nel menu devi mettere tre istruzioni: a) aggiungi p) stampa e x) esci.
Se la 'a' e' selezionata, chiama DatiArtista.AddFromScanner() (questo aggiungera' solo UN artista, poi torna al menu e puoi continuare a selezionare 'a' aggiungendo quanti artisti vuoi)
Se la 'p' e' selezionata, chiama DatiArtista.Print() (che la devi scrivere)
Se la 'x' e' selezionata, esci dal loop e stampa "Ciao a presto e grazie per tutto il pesce" :)

Vedo adesso che ho fatto uno sbaglio nella classe DatiArtista, ho sbagliato a dichiarare il costruttore:

Codice:
Class DatiArtista
{
    private Artista[] artista;
    private int numArtisti;
    private int maxArtisti;
    
    public DatiArtista()

Tra l'altro io avrei dato a questa classe un nome diverso, visto che e' una collezione di artisti, la avrei chiamata semplicemente Artisti (plurale)
Post unito automaticamente:

Che programmare non sia facile, mi pare sia ovvio :) Java non e' ne' piu' facile ne' piu' difficile di altri. Ma e' molto rigoroso, per me uno dei linguaggi migliori per imparare.
 

Lucym80

Nuovo Utente
12
2
Ciao, avevo messo il while pensando che fin quando l'utente inserisse la lettera a ripetesse sempre "inserisci nome eccetera.
Hai perfettamente ragione quando dici che non puoi scrivermi tutto il codice, altrimenti non imparo mai.
Riguardo ai nomi, so che non sono un granché, ma mi sto applicando più sul codice che per i nomi.
Provo a raccogliere le idee e ci riprovo.
Ancora grazie di tutto!
 

Andretti60

Utente Èlite
6,440
5,091
...
Riguardo ai nomi, so che non sono un granché, ma mi sto applicando più sul codice che per i nomi.
...
No vorrei sembrare ossessivo (anzi: lo sono :) in fondo e' il mio mestiere ) ma "scrivere codice" significa lavorare su variabili, a cui devi dare un nome. Piu' il programma si ingigantisce, piu' sara' difficile in seguito cambiare i nomi (specie se sono associati a membri pubblici). Ti assicuro, e' sempre meglio partire bene, specialmente agli inizi, usare una nomenclatura corretta aiuta tantissimo a capire il codice.

E usare nomenclatura giusta e' poi un mio pallino.
 

Lucym80

Nuovo Utente
12
2
Salve Andrea e a tutti, prima di tutto buone feste! Scusa se rispondo solo ora, ma con le feste non sono riuscita a scrivere prima. Ok, seguirò il tuo consiglio anche per i nomi, infatti ho già modificato i metodi: poi leggerò anche il link che mi hai segnalato.
Adesso il programma funziona, credo che non mi sovrascrivi più l'elemento dell'array, ma non so perché i tasti che ho assegnato funzionano solo la prima volta e non anche le altre volte.
Potresti aiutarmi a capire dove sbaglio?
ti lascio il codice.
Mille grazie!
Prima classe.
Codice:
package EserciziJava.esercizio2;
public class Artista {
private String nome;
private String cognome;
private int dataDiNascita;
private String biografia;
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}
public String getCognome() {
    return cognome;
}
public void setCognome(String cognome) {
    this.cognome = cognome;
}
public int getDataDiNascita() {
    return dataDiNascita;
}
public void setDataDiNascita(int dataDiNascita) {
    this.dataDiNascita = dataDiNascita;
}
public String getBiografia() {
    return biografia;
}
public void setBiografia(String biografia) {
    this.biografia = biografia;
    }
}
Seconda classe.
Codice:
package EserciziJava.esercizio2;
import java.util.Scanner;

public class DatiArtista{
    private Artista[] artisti;
    Scanner scanner = new Scanner (System.in);
        
    public DatiArtista() {

        artisti = new Artista[100];
    }    
            
    public void creaArtisti () {
            for (int i = 0; i<this.artisti.length; i++) {
                if(artisti[i]!=null & i> this.artisti.length-1) {
                    System.out.println("Attenzione! l'archivio risulta pieno");
                }
                else {
                    artisti[i] = new Artista();
                        System.out.println("Inserisci nome");
                        
               artisti[i].setNome(scanner.nextLine());

            
                        
            System.out.println("Inserisci cognome");
            artisti[i].setCognome( scanner.nextLine());

            System.out.println("Inserisci data di nascita.");
            scanner.nextLine();
            
            System.out.println("Inserisci biografia");
        artisti[i].setBiografia( scanner.nextLine());
        System.out.println("Digita 1 per continuare, 2 per visualizzare gli artisti, oppure 3 per chiudere");
        scanner.nextLine();

        
            
        


        
}                
                }
    }
    
            public void mostraArtisti() {
                System.out.println(artisti);
            }
}
Terza classe.
Codice:
package EserciziJava.esercizio2;
import java.util.Scanner;

public class ApplicazioneArchivio {    
     public static void main(String args[] ) {
         DatiArtista datiartista = new DatiArtista();
             int scelta;         
             Scanner scanner = new Scanner(System.in);

        System.out.println("Benvenuto nell'archivio dove puoi inserire tutti i dettagli dei tuoi artisti preferiti. Digita 1 per inserire gli artisti, 2 per visualizzare tutti gli artisti inseriti, 3 se vuoi terminare il programma");
        
        scelta = scanner.nextInt();
            
switch(scelta) {
case 1:
    datiartista.creaArtisti();
break;
case 2:
    datiartista.mostraArtisti();
    break;
case 3:
    System.out.println("Ciao e alla prossima!");
    
    break;
    default:
        System.out.println("Inserimento non valido!");
        
        
        }
                }
                }
Ancora mille grazie!
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili