Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente bannato
    Registrato dal
    Dec 2007
    Messaggi
    14

    Java! Inserimento oggetti in un vector

    Salve a tutti,
    ho creato un vector per l'inserimento di dati anagrafici delle persone per poi ordinarle per cognome. Questi dati sono presenti in una classe chiamata anagrafica mentre il vector è nella classe lista, il problema è che durante l'inserimento ad esempio di solamente due persone, la prima la salva, la seconda anche ma due volte: sostituisce la persona inserita la prima volta per poi inserirsi nella posizione 2 del vector, ho provato ad usare la funzione insertElementAt indicando la posizione precisa dell'inserimento delle persone dopo la prima ma niente questo è il codice così potete capire meglio:

    import java.io.*;
    import java.util.*;

    public class ordinamento_dinamico {

    public static void main(String[] args) {
    InputStreamReader input=new InputStreamReader(System.in);
    BufferedReader tastiera=new BufferedReader(input);

    anagrafica persona=new anagrafica();
    lista lista_persone = new lista();

    int scelta;
    String m = null;

    do{
    persona.inserimento();
    lista_persone.aggiungi(persona);
    System.out.println("Inserito");
    System.out.println("Vuoi inserire un'altra persona? 0=si, 1=no");
    try {
    m=tastiera.readLine();
    }catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    scelta=Integer.valueOf(m).intValue();
    //lista_persone.ordina();
    }while(scelta==0);

    lista_persone.stampa(persona);

    }
    }



    public class lista {
    private static Vector elementi;

    lista(){
    elementi=new Vector();
    }

    public void aggiungi(anagrafica obj){
    elementi.addElement(obj);
    //elementi.insertElementAt(obj,i);
    System.out.println("Inserito");
    }

    public anagrafica elimina(anagrafica obj){
    if(!vuota()){
    int dim=elementi.size();

    if(dim>0){
    obj=(anagrafica)elementi.elementAt(0);
    elementi.removeElementAt(0);
    }
    }
    else
    System.out.println("LISTA VUOTA");

    return obj;
    }

    public boolean vuota(){
    if(elementi.size()>0)
    return false;
    else
    return true;
    }

    /*public void ordina(){
    int dim=elementi.size();
    anagrafica buffer=new anagrafica();
    anagrafica first=new anagrafica();
    if(!vuota())
    for(int i=0;i<dim-1;i++){
    buffer=(anagrafica) elementi.elementAt(i);
    for(int j=i+1;j<dim;j++){
    first=(anagrafica) elementi.elementAt(j);
    if(buffer.cognome.compareTo(first.cognome)>=0){
    elementi.setElementAt(first,i);
    elementi.setElementAt(buffer,j);
    }
    }
    }
    else
    System.out.println("LISTA VUOTA");
    }*/


    public void stampa(anagrafica buffer){
    int i;
    int n=elementi.size();
    System.out.println("\nLa lista di persone ordinata Ë:");
    for(i=0;i<n;i++){
    buffer=(anagrafica)elementi.elementAt(i);
    System.out.println("Persona "+(i+1)+": "+buffer.cognome+" "+buffer.nome+" nato il "+buffer.gg+"/"+buffer.mm+"/"+buffer.a);
    }
    }
    }


    public class anagrafica {
    String nome,cognome;
    int gg,mm,aaaa;
    String g,m,a;

    anagrafica(){
    nome=" ";
    cognome=" ";
    gg=0; mm=0; aaaa=0;
    }

    void inserimento(){
    InputStreamReader input=new InputStreamReader(System.in);
    BufferedReader tastiera=new BufferedReader(input);

    System.out.println("\nImmetti il nome");
    try {
    this.nome=tastiera.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    System.out.println("\nImmetti il cognome");
    try {
    this.cognome=tastiera.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    System.out.println("\nImmetti la data di nascita");
    System.out.println("Giorno:");
    try {
    g=tastiera.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    this.gg=Integer.valueOf(g).intValue();

    System.out.println("Mese:");
    try {
    m=tastiera.readLine();
    }
    catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    this.mm=Integer.valueOf(m).intValue();

    System.out.println("Anno:");
    try {
    a=tastiera.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    this.aaaa=Integer.valueOf(a).intValue();
    }
    }

  2. #2

    Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da manuel_samele
    ho creato un vector per l'inserimento di dati anagrafici delle persone per poi ordinarle per cognome. Questi dati sono presenti in una classe chiamata anagrafica mentre il vector è nella classe lista, il problema è che durante l'inserimento ad esempio di solamente due persone, la prima la salva, la seconda anche ma due volte
    Ogni volta devi istanziare una nuova persona, altrimenti nel vector salvi lo stesso oggetto..

  3. #3
    Utente bannato
    Registrato dal
    Dec 2007
    Messaggi
    14

    Re: Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da VincenzoTheBest
    Ogni volta devi istanziare una nuova persona, altrimenti nel vector salvi lo stesso oggetto..
    ho fatto anche io questo ragionamento ma non ha logica poichè alla fine di persone ne stampa due e non una soltanto, quindi entrambe le posizioni esistono nel vector, ma la seconda sovrascrive la prima e si inserisce di nuovo subito dopo

  4. #4

    Re: Re: Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da manuel_samele
    ho fatto anche io questo ragionamento
    Dal codice che hai scritto non si direbbe...

    E poi sinceramente la classe anagrafica non è ben definita (è sprovvista di metodi get e set).

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Ho spostato la discussione nel forum dedicato a Java.
    In futuro, poni qui le tue domande relative a questo linguaggio.

    Inoltre, il codice sorgente deve essere formattato usando il tag [CODE].

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente bannato
    Registrato dal
    Dec 2007
    Messaggi
    14

    Re: Re: Re: Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da VincenzoTheBest
    Dal codice che hai scritto non si direbbe...

    E poi sinceramente la classe anagrafica non è ben definita (è sprovvista di metodi get e set).
    ho dimenticato di metterli, provvederò a farlo...
    comunque in output alla fine del programma mettendo due persone in input, ho lo stesso due persone, solo che la seconda inserita sovrascrive la prima e si inserisce di nuovo subito dopo

  7. #7

    Re: Re: Re: Re: Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da manuel_samele
    comunque in output alla fine del programma mettendo due persone in input, ho lo stesso due persone, solo che la seconda inserita sovrascrive la prima e si inserisce di nuovo subito dopo
    Ti ho già dato la soluzione al problema...ma evidentemente oltre al concetto di metodo get e set, ti manca anche quello di istanziazione...

    Originariamente inviato da manuel_samele
    codice:
     anagrafica persona=new anagrafica(); 
    lista lista_persone = new lista();
    
    int scelta;
    String m = null;
    
    do{
    persona.inserimento();
    lista_persone.aggiungi(persona);
    System.out.println("Inserito");
    System.out.println("Vuoi inserire un'altra persona? 0=si, 1=no");
    try {
    m=tastiera.readLine();
    }catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    scelta=Integer.valueOf(m).intValue();
    //lista_persone.ordina();
    }while(scelta==0);
    
    lista_persone.stampa(persona);
    
    }
    }
    L'istruzione evidenziata in rosso va messa nel ciclo.

  8. #8
    Utente bannato
    Registrato dal
    Dec 2007
    Messaggi
    14

    Re: Re: Re: Re: Re: Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da VincenzoTheBest
    Ti ho già dato la soluzione al problema...ma evidentemente oltre al concetto di metodo get e set, ti manca anche quello di istanziazione...


    L'istruzione evidenziata in rosso va messa nel ciclo.
    -.- non sta a te giudicare!
    io ti ho già detto che ho pensato a questa soluzione, ma non mi sembrava potesse essere così perchè se fosse realmente questa allora in output al termine di tutto il vector dovrebbe contenere un solo oggetto, invece ne ha due, come dovrebbe se due sono le persone inserite, solo che la seconda sovrascrive la prima.
    forse ti manca il concetto di italiano....

  9. #9

    Re: Re: Re: Re: Re: Re: Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da manuel_samele
    -.- non sta a te giudicare!
    io ti ho già detto che ho pensato a questa soluzione, ma non mi sembrava potesse essere così perchè se fosse realmente questa allora in output al termine di tutto il vector dovrebbe contenere un solo oggetto, invece ne ha due, come dovrebbe se due sono le persone inserite, solo che la seconda sovrascrive la prima.
    forse ti manca il concetto di italiano....
    Sei assurdo.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Re: Re: Re: Re: Re: Re: Re: Java! Inserimento oggetti in un vector

    Originariamente inviato da manuel_samele
    -.- non sta a te giudicare!
    io ti ho già detto che ho pensato a questa soluzione, ma non mi sembrava potesse essere così perchè se fosse realmente questa allora in output al termine di tutto il vector dovrebbe contenere un solo oggetto, invece ne ha due, come dovrebbe se due sono le persone inserite, solo che la seconda sovrascrive la prima.
    forse ti manca il concetto di italiano....
    La considerazione fatta da Vincenzo deriva da quello che hai scritto.
    Senza offesa, ma non sembra che tu abbia ben chiaro cosa fa l'istruzione new e cosa fa il metodo add() di Vector.

    Se io istanzio un oggetto (istruzione new), in memoria avrò un oggetto.
    Questo oggetto io lo posso inserire infinite volte dentro ad un Vector ed il vector si riempirà di "n" posizioni tutte riferite allo stesso oggetto. Quindi, se io richiamo il metodo "add()" di Vector 10 volte, passandogli sempre lo stesso oggetto, il Vector conterrà 10 volte lo stesso oggetto.

    Se richiedo la stampa del contenuto del Vector, questa mi produrrà 10 volte la stessa cosa.

    Quindi, la soluzione proposta da Vincenzo è corretta: devi istanziare (ovvero fare una new) ogni volta un nuovo oggetto dentro al ciclo, altrimenti ogni volta andrai a sovrascrivere i dati preesistenti e tutte le copie del Vector vedranno queste modifiche (quello che tu hai interpretato come una "sovrascrittura", in realtà è solo una riflessione delle modifiche fatte).

    Provo a spiegarlo con un esempio:

    codice:
    Vector v = new Vector();
    
    Persona p = new Persona("Amerigo", "Vespucci", "Marinaio");
    
    v.add( p );
    
    p.setCognome("Garibaldi");
    p.setNome("Giuseppe");
    p.setMansione("Combattente");
    
    v.add( p );
    La prima riga crea il Vector.
    La seconda riga crea un oggetto "Persona"
    La terza riga inserisce la persona nel Vector
    Le righe dalla quarta alla sesta, modificano la persona (anche quella nel Vector, perchè è un riferimento, non una copia!)
    La settima riga inserisce un'altra volta l'oggetto persona (sempre lo stesso!!!) nel Vector.

    Risultato: nel Vector ci sono due copie dello stesso indirizzo e questo indirizzo punta allo stesso identico oggetto Persona.

    Il secondo inserimento non ha sovrascritto il primo. Sono state le 3 righe precedenti, a modificare i dati.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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