|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2002
Città: Rovigo
Messaggi: 343
|
[java] ordinamento di hashMap
Devo fare un database in java, e devo ordinare i cd e i vhs x titolo (e/o per autore). Come posso fare? Nelle slides del prof. ci sono dei metodi che non esistono!:wft:
Vi riporto il codice: (modificato)
__________________
Cuore sportivo IN OLANDA E' LEGALE!!!! "...sempre onti anca cola patente a ponti" Ultima modifica di Burlindo : 24-11-2003 alle 09:48. |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
E' stato il tuo professore a dirti di usare degli oggetti HashMap per il database?
La risposta alla domanda ci dirà chi è stato a "fregarti". Gli HashMap supportano un ordinamento dei dati in base alle chiavi. Il che vuol dire che anche con tutta la buona volontà non puoi ordinarne il contenuto in base ai valori. Se devi mantenere gli oggetti "HashMap" allora puoi fare una "query" sull'oggetto "Collection" a cui accedi con il metodo "values()" di HashMap, crei poi una lista (List) di riferimenti e usi il metodo sort(List, Comparator) della classe Collections per ordinare i valori. L'ordinamento realizzato non modifica l'ordine dell'hash-map. Al solito, in Java è più facile a farsi che a dirsi, saranno si e no 10 righe di codice. Secondo me le strade alternative comportano l'abbandono degli oggetti HashMap per dei List, ma sono pronto ad ascoltare pareri alternativi. &Ciao. |
![]() |
![]() |
![]() |
#3 | |||
Senior Member
Iscritto dal: Oct 2002
Città: Rovigo
Messaggi: 343
|
Quote:
Quote:
Quote:
Ti ringrazio per il tuo interessameto, molto utile in questi momenti di sconforto ![]()
__________________
Cuore sportivo IN OLANDA E' LEGALE!!!! "...sempre onti anca cola patente a ponti" |
|||
![]() |
![]() |
![]() |
#4 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
A volte un po' di codice è meglio delle parole.
Codice:
import java.util.*; /** * * @author */ public class MainClass { public MainClass() { HashMap database=new HashMap(); database.put(new Integer(1), new Persona("Gianni", "Verdi")); database.put(new Integer(2), new Persona("Pippo", "Neri")); database.put(new Integer(3), new Persona("Marco", "Bianchi")); database.put(new Integer(4), new Persona("Aldo", "Neri")); Comparator customCompare=new Comparator() { public int compare(Object o1, Object o2) { Persona p1=(Persona)o1; Persona p2=(Persona)o2; int value=p1.cognome.compareTo(p2.cognome); return value==0 ? p1.nome.compareTo(p2.nome) : value; } }; printSortedDatabase(database, customCompare); } public void printSortedDatabase(HashMap map, Comparator sorteOp) { ArrayList list=new ArrayList(map.values()); Collections.sort(list, sorteOp); Iterator iterator=list.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } } class Persona { String nome=null, cognome=null; Persona(String nome, String cognome) { this.nome=nome; this.cognome=cognome; } public String toString() { return nome+" "+cognome; } } public static void main(String[] a) { new MainClass(); } } La classe annidata "Persona" serve come esempio minimo di un oggetto da infilare nel database. Possiede due campi String, nome e cognome, è una situazione simile a quella che hai nel database (solo un po' più ridotta). Le due parti che ci interessano sono la definizione del nostro "Comparator" e il metodo "printSortedDatabase" L'ordinamento sfrutta il metodo sort(List, Comparator) della classe Collections. List è la lista che contiene i valori da ordinare, Comparator è un oggetto che implementi l'interfaccia omonima. L'interfaccia Comparator ha un metodo, compare(Object oggetto1, Object oggetto2) che restituisce un intero. L'intero restituito dal metodo "compare" è usato dall'algoritmo di ordinamento contenuto nel metodo "sort" per ordinare gli oggetti nella lista. Il valore può essere "-1", "0", "1", dove -1 sta per intero negativo e 1 per intero positivo. I tre numeri rappresentano il risultato del confronto tra i due oggetti nell'ordine di argomento: ad esempio, se oggetto1 è "minore" di oggetto2 dovrebbe restituire un valore negativo. La prima operazione che scegliamo per il metodo "compare" è un casting dei due oggetti-parametro in due variabili di tipo "Persona" (cosa che si adatta alla minimalità dell'esempio, già sappiamo che il nostro database conterrà solo oggetti Persona). Poi eseguiamo un confronto tra i campi String "cognome" dei due oggetti Persona. Nota che String implementa Comparable: la definizione di String del metodo "compareTo" restituisce un intero che rappresenta la posizione "realtiva" della stringa rispetto ad un'altra in ordine alfabetico (ed è quello che ci serve). String.compareTo(String) restituisce 0 se le due stringhe hanno la stessa "posizione alfabetica" (nell'esempio corrisponde al caso in cui le due persone abbiano lo stesso cognome). Per semplicità usiamo l'operatore ternario di java per gestire questo caso, che restituisce il valore del confronto tra i campi "Nome". Il metodo "printSortedDatabase" estrae dall'oggetto HashMap la lista dei valori (restituita come Collection dal metodo "values()"). Per poter ordinare l'oggetto collection lo "infiliamo" in un "List" (in questo caso un ArrayList) che poi passiamo al metodo (statico) "sort" della classe Collection insieme al nostro Comparator. Il risultato è che il contenuto della lista verrà ordinato alfabeticamente sui campi "cognome" e "nome". Non è il modo più efficiente immaginabile ma il codice che risulta è estremamente "pulito" |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Oct 2002
Città: Rovigo
Messaggi: 343
|
Grazie, adesso provo. Non sapresti indicarmi qualche libro di testo dove sono riportati esempi di algoritmi?? ...Credo che mi serva una buona base per poter migliorare.
__________________
Cuore sportivo IN OLANDA E' LEGALE!!!! "...sempre onti anca cola patente a ponti" |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Esempi di algoritmi, no. Se cerchi degli algoritmi di ordinamento Internet e Google sono in genere degli ottimi strumenti, cercando un po' si trovano cose straordinarie.
Di codice Java ne trovi parecchio in rete, di scritto personalmente adoro quei libroni della Apogeo che costano uno sproposito, dicono poco o nulla, ma hanno almeno una riga di codice per ogni classe("Java2 tutto ed oltre" (rosso), "Java2 SDK 1.4" ad esempio). |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2004
Messaggi: 853
|
e se volessi semplicemente scorrere e stampare a video il contenuto di una HashMap tipo questa:
Codice PHP:
non riesco a saltarci fuori... ![]()
__________________
Disclaimer: "Si prega i gentili lettori di attenersi alle sole parole presenti nel messaggio nel tentativo di comprendere il pensiero dell'autore.Siete calorosamente invitati ad evitare letture della mente,voli pindarici o presunte letture tra le righe nel tentativo vano di capire quale potrebbe essere l'opinione dell'autore riguardo ad argomenti non trattati da esso. Si prega inoltre,sebbene dovrebbe essere pratica standard,di leggere con attenzione tutte le parole utilizzate. Grazie." |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
o mmmio ddio....hai uppato una discussione del "vecchio" pgi
![]() ![]() ![]() ora arriva pgi-bis e ti risponde, io la momento sono troppo impegnato a strapazzarmi dalle risate ![]() ![]() ![]() comunque per scorrerla solitosistema con iteratore, per stampare solo quelli che ti interessano fai un equals sul "cognome" e fai stamapre solo quelli che rispettano l'equals. sò,che come al solito, sono stato CHIARISSIMO, ma al momento purtropppo non posso concederti altro tempo. scusami.
__________________
My gaming placement |
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Jul 2004
Messaggi: 853
|
Quote:
![]() Quote:
provo a riguardare meglio questo Iterator.
__________________
Disclaimer: "Si prega i gentili lettori di attenersi alle sole parole presenti nel messaggio nel tentativo di comprendere il pensiero dell'autore.Siete calorosamente invitati ad evitare letture della mente,voli pindarici o presunte letture tra le righe nel tentativo vano di capire quale potrebbe essere l'opinione dell'autore riguardo ad argomenti non trattati da esso. Si prega inoltre,sebbene dovrebbe essere pratica standard,di leggere con attenzione tutte le parole utilizzate. Grazie." |
||
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
praticamente, non sò perchè, ma l'account di pgi è stato bannato (come pouoi vedere da sotto il suo nick), e si dice (leggenda metropolitana....verità...solo lui sà
![]() ![]() l'ho scoperto in periodo di tesi ![]() ![]() ![]() ![]()
__________________
My gaming placement |
![]() |
![]() |
![]() |
#11 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
cercando gli altri messaggi di PGI-Bis ho anche scoperto perché è stato bannato: ha chiesto lui stesso, con un sobrio messaggio di addio con tanto di firma, di essere rimosso dal forum :|
e ha fatto ciò perché a2000 l'aveva offeso ![]() purtroppo a2000 era una versione vecchia e buggata, adesso per fortuna l'hanno patchata ed è uscita la a2000.1, quindi queste cose non dovrebbero più succedere ![]() PS: dalla letterina d'addio di PGI-Bis ho scoperto che il suo vero nome è Pierluigi ![]() |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2004
Messaggi: 853
|
Quote:
![]()
__________________
Disclaimer: "Si prega i gentili lettori di attenersi alle sole parole presenti nel messaggio nel tentativo di comprendere il pensiero dell'autore.Siete calorosamente invitati ad evitare letture della mente,voli pindarici o presunte letture tra le righe nel tentativo vano di capire quale potrebbe essere l'opinione dell'autore riguardo ad argomenti non trattati da esso. Si prega inoltre,sebbene dovrebbe essere pratica standard,di leggere con attenzione tutte le parole utilizzate. Grazie." |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Supponendo che Persona abbia un metodo getCognome(), si può fare (esempio):
Codice:
Map<String,Persona> map = new HashMap<String,Persona> (); map.put ("p1", new Persona ("Gianni", "Verdi")); map.put ("p2", new Persona ("Pippo", "Neri")); map.put ("p3", new Persona ("Marco", "Bianchi")); map.put ("p4", new Persona ("Aldo", "Neri")); for (Persona p : map.values ()) { if (p.getCognome ().equals ("Neri")) System.out.println ("trovato"); }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jul 2004
Messaggi: 853
|
Grazie mille andbin!!
![]() ...ti chiedo brevemente 2 cose: 1) Come si legge questa riga di codice? Codice:
for (Persona p : map.values ()) Codice:
Map<String,Persona> map = new HashMap<String,Persona> ();
__________________
Disclaimer: "Si prega i gentili lettori di attenersi alle sole parole presenti nel messaggio nel tentativo di comprendere il pensiero dell'autore.Siete calorosamente invitati ad evitare letture della mente,voli pindarici o presunte letture tra le righe nel tentativo vano di capire quale potrebbe essere l'opinione dell'autore riguardo ad argomenti non trattati da esso. Si prega inoltre,sebbene dovrebbe essere pratica standard,di leggere con attenzione tutte le parole utilizzate. Grazie." |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
La prima è un semplice ciclo for each, in pratica si legge così: per ogni Persona p appartenente alla collection restituita da map.values() esegui..... La seconda è l'uso dei generics, un sistema studiato per effettuare un controllo a livello di compilazione sul tipo di dati inserito in una collection. In pratica stai dicendo che la chiave della mappa è una stringa e il valore memorizzato è un oggetto di tipo persona. In questo modo non è + necessario effettuare il cast quando estrarrai un oggetto dalla mappa.
__________________
![]() |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jul 2004
Messaggi: 853
|
ho capito...
Grazie a tutti! Gentilissimi ![]()
__________________
Disclaimer: "Si prega i gentili lettori di attenersi alle sole parole presenti nel messaggio nel tentativo di comprendere il pensiero dell'autore.Siete calorosamente invitati ad evitare letture della mente,voli pindarici o presunte letture tra le righe nel tentativo vano di capire quale potrebbe essere l'opinione dell'autore riguardo ad argomenti non trattati da esso. Si prega inoltre,sebbene dovrebbe essere pratica standard,di leggere con attenzione tutte le parole utilizzate. Grazie." |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:09.