Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    4

    [JAVA]classe LinkList

    Salve a tutti, questo è il mio primo messaggio e spero di non aver sbagliato..
    Ho fatto una ricerca nel sito e mmi sembra che il mio problema non sia stato trattato.

    Allora, premettendo che sono un principiante di questo linguaggio, ho tentato di creare una lista sfruttando la classe LinkList, finchè si tratta di una lista di interi o stringhe mi funziona bene ma poi mi è venuta l'idea di fare una lista di oggetti..

    La mia idea è di fare una lista(ex.rubrica) che contiene tutti oggetti(ex. contatti)
    Il codice che ho scritto fin ora:

    codice:
    import java.util.*;
    
    public class Contatto { 
        String nome,cognome;
        long numero; 
        public Contatto(String n,String m,long num){ 
             nome=n;
             cognome=m;
             numero=num;
         } 
     }
    
    public class ListaContatti {
    
        LinkedList<Contatto> lista_contatti=new LinkedList<Contatto>(); 
    
        public ListaContatti(){};
    
        public void newContatto(int pos,String n,String m,long num){  
            Contatto x= new Contatto(n,m,num);  
            lista_contatti.add(pos,x);          
        }
    
        public void print(){
            System.out.println(lista_contatti); 
        }
    }
    
    public class Main {
        public static void main(String[] args) {
    
            String nome,cognome;
            int scelta,posizione;
            long numero;
    
            
                    System.out.println("inserisci un nome");
                    Scanner in=new Scanner(System.in);
                    nome=in.nextLine();
    
                    System.out.println("inserisci un cognome");
                    Scanner in2=new Scanner(System.in);
                    cognome=in2.nextLine();
    
                    System.out.println("Inserisci un numero di telefono");
                    Scanner in3=new Scanner(System.in);
                    numero=in3.nextInt();
    
                    System.out.println("Inserisci la posizone dove inserire il contatto");
                    Scanner in5=new Scanner(System.in);
                    posizione=in5.nextInt();
    
                    ListaContatti obj=new ListaContatti(); 
                    obj.newContatto(posizione,nome,cognome,numero);  
                    obj.print();
        }
    }
    Il codice è ovviamente incompleto, mancano alcuni metodi tipici per una rubrica, ma il mio problema è che quando esegue la print() il programma stampa "[rubricatelefonica.Contatto@173a10f]" invece dei dati inseriti poco prima e sinceramente non capisco il perchè...

    Grazie in anticipo per il ogni possibile aiuto.
    Il mondo è nelle mani di coloro che hanno il coraggio di sognare e di correre il rischio di vivere i propri sogni. P.Coelho

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

    Re: [JAVA]classe LinkList

    Originariamente inviato da dans
    Salve a tutti, questo è il mio primo messaggio e spero di non aver sbagliato..
    Ho fatto una ricerca nel sito e mmi sembra che il mio problema non sia stato trattato.
    Java ha un forum dedicato.
    Ho spostato la discussione.

    Probabilmente il problema è già stato trattato, ma in quest'area, non in quella generale "Programmazione".


    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Ciao, benvenuto nel forum
    ad occhio e croce ti manca l'override del metodo toString() dei vari oggetti.
    quello che tu vedi è il risultato del toString di default

  4. #4
    Ciao dans,
    Come pretendi che java sappia come vuoi che il tuo oggetto sia rappresentato sotto forma di stringa ?
    Ti do un aiuto fai una ricerca nel forum con la parola chiave toString

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    4
    Allora, mi scuso per l'errore e ringrazio per l'aiuto.
    Avevate ragione, mi serviva il toString(), l'ho messo e mi ha stampato correttamente.

    Ho prevato poi a sviluppare tutti gli altri comuni metodi di una rubrica, tra cui la ricerca..
    ora non ho capito come scorrere la rubrica, cioè come scorrere la lista di oggetti Contatto e confrontare ogni oggetto con il Contatto da cercare.
    Il mondo è nelle mani di coloro che hanno il coraggio di sognare e di correre il rischio di vivere i propri sogni. P.Coelho

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    la lista la scorri con un banalissimo ciclo for, per quanto riguarda il confronto ogni oggetto ha il metodo equals, devi usare quello per il confronto (== confronta i riferimenti e funziona solo per i tipi primitivi).

    Di solito assieme all'override di equals io faccio anche quello di hashcode (e trovi parecchio materiale sul sito della oracle)

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    4
    allora, non riesco a fare questa ricerca.
    in pratica io ho creato un nuovo oggetto da confrontare con quelli nella lista:

    codice:
    System.out.println("inserisci il contatto da cercare:");
    System.out.println("inserisci il nome");
    Scanner in=new Scanner(System.in);
    nome=in.nextLine();
    
    System.out.println("inserisci il cognome");
    Scanner in2=new Scanner(System.in);
    cognome=in2.nextLine();
    
    System.out.println("Inserisci il numero di telefono");
    Scanner in3=new Scanner(System.in);
    numero=in3.nextInt();
    
    Contatto obj1= new Contatto(nome,cognome,numero);
    if(obj.find(obj1)==true)
         System.out.println("Il contatto e' in rubrica");
    else
         System.out.println("Il contatto non è in rubrica");
    e poi nella classe ListaContatti il metodo find()
    codice:
    public boolean find(Contatto x1){ 
            Iterator itr = lista_contatti.iterator();  
    
            while(itr.hasNext()) { 
                  Object element = itr.next(); 
                  System.out.println(element.toString());
                  System.out.println(x1.toString());
                  tf= element.equals(x1); 
                  System.out.println(tf);
                  hc=element.hashCode();
                  hc1=x1.hashCode();
                  System.out.println("hc="+hc+"hc1="+hc1);
                  if(tf==true || hc==hc1)
                      tf1=true;
            }
         return tf1;
    }
    e quindi in output ho:

    codice:
    Nome:a    Cognome:a    Numero:0
    Nome:c    Cognome:c    Numero:2
    false
    hc=19336051 hc1=6336176
    
    Nome:b    Cognome:b    Numero:1
    Nome:c    Cognome:c    Numero:2
    false
    hc=23899971 hc1=6336176
    
    Nome:c    Cognome:c    Numero:2
    Nome:c    Cognome:c    Numero:2
    false
    hc=6718604 hc1=6336176
    
    Nome:d    Cognome:d    Numero:3
    Nome:c    Cognome:c    Numero:2
    false
    hc=8918002 hc1=6336176
    
    Il contatto non è in rubrica
    ho sicuramente sbagliato qualcosa col metodo equals() visto che il terzo confronto dovrebbe darmi true, ma non capisco cosa...
    Il mondo è nelle mani di coloro che hanno il coraggio di sognare e di correre il rischio di vivere i propri sogni. P.Coelho

  8. #8
    Se magari postasi il codice relativo al metodo equals e hashcode forse ci capiamo qualcosa

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    infatti posta i due metodi (così non è che si capisca molto a dire il vero).

    In linea generale la prassi dei controlli in un equals fatto bene chiede:

    1. controlla che i due riferimenti non siano uguali (riferimenti uguali corrisponde oggetto uguale)
    2. controlla che il riferimento che passi non sia null (in tal caso confronti qualcosa con null sicuramente hai che non sono uguali)
    3. controlla che i due oggetti siano della stessa classe (classi differenti non possono essere uguali
    4. controlla l'uguaglianza parametro per parametro, che uno non sia nullo e l'altro valorizzato (indica che c'è qualcosa che non va)
    Per esempio solo per cognome
    codice:
    if (cognome == null && other.cognome != null ) return false; 
    if (cognome != null && other.cognome == null ) return false; 
    if (!cognome.equals(other.cognome))  return false;
    5. se non ti sei fermato in nessun punto sono uguali.

    per quanto riguarda hashcode la prassi generale vuole:

    codice:
    public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((cognome == null) ? 0 : cognome.hashCode());
    		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
    		result = prime * result + numero;
    		return result;
    	}
    questi 2 esempi ormai me li faccio generare in modo automatico da eclipse, ma se guardi bene a livello di codice rispondono ai criteri generali fissati dalla teoria

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    inoltre l'uguaglianza vera ce l'hai se i due oggetti sono uguali e se hanno equals uguale, se non valgono entrambe le condizioni non sei sicuro dell'uguaglianza.
    E' buona norma comunque per le collection implementarli tutti e due

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.