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.
- 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.
- 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... |
|
|