Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 Cultura Informatica
 Corso di java
 Collections

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista Inserisci Faccine
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Smilies
Approvazione [^] Arrabbiato [:(!] Bacio [:X] Bevuta [:273]
Caldo [8D] Compiaciuto [8)]    
compleanno [:269]
Davvero Felice [:D] Diavoletto [}:)] Disapprovazione [V] Domanda [?]
Felice [:)] Fumata [:29] Goloso [:P] Imbarazzato [:I]
Infelice [:(] Morte improvvisa da [:62]
Morto [xx(] Occhio Nero [B)] Occhiolino [;)] Palla 8 [8]
pc [:205]    
Riproduzione [:76]
Scioccato [:O]      

   Allega file
  Clicca qui per inserire la tua firma nel messaggio.
Clicca qui per sottoscrivere questa Discussione.
    

V I S U A L I Z Z A    D I S C U S S I O N E
genius Inserito il - 02/06/2007 : 13:36:43
Tutto quello ke riguarda le Collections di Oggetti saranno messe in questa discussione, quindi se avete dubbi riguardo HashMap, ArrayList e simili, postate qui la vostra domanda.


  • Ordinare una Collection di oggetti (ad esempio una lista):

    Esistono due modi non esclusivi per ordinare una Collection.

    1. Implementare l'interfaccia java.lang.Comparable

      Per poter adottare questo metodo è necessario disporre del codice sorgente della classe su cui vogliamo definire l'ordinamento. Questo perchè dovremo modificarne il codice in modo da implentare appunto l'interfaccia.

      Il meccanismo è semplicissimo. Poniamo di voler definire una classe Studente, e voler ordinare una lista di studenti per matricola.

      La classe Studente è definita come segue:
      public class Studente implements Comparable<Studente> {
      	
      	private int matricola;
      	private String nome;
      	
      	public Studente(String nome, int matricola){
      		this.nome = nome;
      		this.matricola = matricola;
      	}
      	
      	public int compareTo(Studente altroStudente) {
      		int risultatoConfronto;
      		if(this.matricola > altroStudente.matricola)
      			// un valore positivo significa che questo oggetto Studente è maggiore dell'altro
      			risultatoConfronto = 1;
      		else if(this.matricola == altroStudente.matricola)
      			// un valore nullo significa che questo oggetto Studente è uguale all'altro
      			risultatoConfronto = 0;
      		else
      			// un valore negativo significa che questo oggetto Studente è minore dell'altro
      			risultatoConfronto = -1;
      		
      		return risultatoConfronto;
      	}
      }
      

      Come si vede dal codice la classe Studente implementa l'interfaccia Comparable. Dato che da java 1.5 l'interfaccia Comparable è generica, ho aggiunto Studente per assicurare il controllo di tipo.
      Questa interfaccia descrive un solo metodo, compareTo che prende in input un parametro, che è l'altro oggetto con cui confrontare quello attuale.
      Assumendo che la matricola sia un intero, il confronto tra oggetti Studenti è stato definito come confronto tra interi.

      Come si usa: per usare il confronto tra oggetti studente è necessario richiamare il metodo compareTo all'occorrenza, per esempio:
      ...
      if(studente1.compareTo(studente2) > 0)
      	System.out.println("il primo studente è successivo al secondo");
      else if(studente1.compareTo(studente2) == 0)
      	System.out.println("gli studenti hanno la stessa matricola");
      else
      	System.out.println("il primo studente è precedente al secondo");
      ...
      

      Se invece vogliamo ordinare una collezione di oggetti Studente (ad esempio un'ArrayList, è sufficente richiamare il metodo statico della classe java.util.Collections, "sort":
      ...
      Collections.sort(listaStudenti);
      ...

      dove listaStudenti è stata precedentemente dichiarata come ArrayList<Studente>), e ovviamente riempita da qualche parte.



    2. Implementare l'interfaccia java.util.Comparator
      Per poter adottare questo metodo NON è necessario disporre del codice sorgente della classe su cui vogliamo definire l'ordinamento.

      Questo metodo è anche più flessibile in quanto definendo n classi che implementano l'interfaccia Comparator, si possono definire più ordinamenti diversi.

      Ritornando all'esempio precedente, usiamo questo secondo metodo per definire lo stesso ordinamento tra oggetti Studente.
      public class MatricolaComparator implements Comparator<Studente> {
      
      	public int compare(Studente stud1, Studente stud2) {
      		int risultatoConfronto;
      		if(stud1.getMatricola() > stud2.getMatricola())
      			// un valore positivo significa che questo oggetto Studente è maggiore dell'altro
      			risultatoConfronto = 1;
      		else if(stud1.getMatricola() == stud2.getMatricola())
      			// un valore nullo significa che questo oggetto Studente è uguale all'altro
      			risultatoConfronto = 0;
      		else
      			// un valore negativo significa che questo oggetto Studente è minore dell'altro
      			risultatoConfronto = -1;
      		
      		return risultatoConfronto;
      	}
      
      }

      Come si può notare, questa volta abbiamo definito una classe a parte che implementa l'interfaccia Comparator. Questa classe deve implementare il metodo compare definito proprio in Comparator. Il codice del metodo è lo stesso che abbiamo visto prima in compareTo, e funziona esattamente allo stesso modo.

      Come si usa: per usare il confronto tra oggetti studente è necessario richiamare il metodo compare all'occorrenza, per esempio:
      ...
      MatricolaComparator comparator = new MatricolaComparator();
      if(comparator.compare(studente1,studente2) > 0)
      	System.out.println("il primo studente è successivo al secondo");
      else if(comparator.compare(studente1,studente2) == 0)
      	System.out.println("gli studenti hanno la stessa matricola");
      else
      	System.out.println("il primo studente è precedente al secondo");
      ...
      

      Se invece vogliamo ordinare una collezione di oggetti Studente (ad esempio un'ArrayList, è sufficente richiamare il metodo statico della classe java.util.Collections, "sort":
      ...
      Collections.sort(listaStudenti, new MatricolaComparator());
      ...

      dove listaStudenti è stata precedentemente dichiarata come ArrayList<Studente>), e ovviamente riempita da qualche parte.



    Approfondimenti
    Come ho detto, i due metodi non sono esclusivi, anzi una buona pratica è quella di utilizzarli (quando possibile) entrambi. Per esempio, possiamo voler definire un ordinamento di "default" utilizzando il primo metodo, e tanti altri ordinamenti alternativi usando il secondo metodo.

    Per esempio, e concludo, diciamo di voler impostare come ordinamento di default quello descritto in precedenza (e implementato usando il primo metodo) e diciamo di voler definire un nuovo ordinamento, per esempio, ordine alfabetico sul nome degli studenti. Si procederà così:
    public class A-ZNomeComparator implements Comparator<Studente> {
    
    	public int compare(Studente stud1, Studente stud2) {
    		// la classe String implementa Comparable, quindi possiamo
    		// usare il metodo compareTo :)
    		return stud1.getNome().compareTo(stud2.getNome());
    	}
    }


    Per usare questo nuovo ordinamento nn serve altro che:
    ...
    Collections.sort(listaStudenti, new A-ZNomeComparator());
    ...








"...e se non hai morale
e se non hai passione
se nessun dubbio ti assale
perché la sola ragione che ti interessa avere
è una ragione sociale
soprattutto se hai qualche dannata guerra da fare
non farla nel mio nome
non farla nel mio nome
che non hai mai domandato la mia autorizzazione
se ti difenderai non farlo nel mio nome
che non hai mai domandato la mia opinione..."
3   U L T I M E    R I S P O S T E    (in alto le più recenti)
Ginumatt Inserito il - 03/06/2007 : 16:12:42
Per me bisogna dare il genere e dovrebbe uscire l'intera lista ordinata per anno non gli autori, perchè tanto cmq sia sono COMPRESI UGUALMENTE.
Cmq per chi può aiutarmi mi servirebbe una conferma sul pezzo di codice del Docum.java (Fabio! cmq sia anche con un integer dovrebbe uscire la cosa) e il modo di inserire il compare in LibGest ovvero nel file principale nel metodo ricerca genere postato sotto

Aiutooooooooo!!!!
genius Inserito il - 03/06/2007 : 10:21:18
Allora, vorrei kiarire una cosa. Questa sezione (Corso di Java) riguarda esclusivamente dubbi sul linguaggio java, non dubbi su particolari problemi, per quello potete usare le normali sezioni del forum. Detto questo, per me la traccia è sbagliata. Perkè vi kiede di elencare gli autori e invece voi avete libri. Quindi, o dovete intedere libri anzikkè autori, oppure dove sparare solamente delle stringhe con i nomi dell'autore... ponendo ke usiate la prima interpretazione, allora è giusto kiedere in input il genere e stampare solo quel genere..



"...e se non hai morale
e se non hai passione
se nessun dubbio ti assale
perché la sola ragione che ti interessa avere
è una ragione sociale
soprattutto se hai qualche dannata guerra da fare
non farla nel mio nome
non farla nel mio nome
che non hai mai domandato la mia autorizzazione
se ti difenderai non farlo nel mio nome
che non hai mai domandato la mia opinione..."
Niky Inserito il - 03/06/2007 : 10:10:20
Genius, ho un dubbio riguardo l'output che dovrebbe visualizzare la richiesta "Elencare, su richiesta, tutti gli autori relativi ad un genere letterario ordinati per anno di pubblicazione", si vuole un output di questo tipo, fornendo come input il genere letterario:
Inserire il genere letterario da ricercare: avventura
GENERE: avventura
ANNO:2002
autori...
ANNO: 2007
autori...

OPPURE si vuole un otput generale di tutti gli autori che hanno scritto libri di ogni genere letterario presente nella libreria e quindi senza fornire nessun parametro di ricerca per quanto riguarda il genere

thank you...

Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,11 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000