Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Chiave HashTable

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    60

    Chiave HashTable

    Ho una Hashtable nella classe Gioco che ha come chiave un'altra classe Coordinata.
    grigliaGioco.put(new Coordinate(0,0), pila).
    Il mio problema è come faccio a recuperare poi la chiave??
    grigliaGioco.get(????).

    Grazie

  2. #2
    Quando usi un array associativo, e hashtable lo è, la classe che fa da chiave deve implementare il metodo equals altrimenti java non è in grado di capire se due istanze rappresentano lo stesso valore.
    Fatto questo, potrai recuperare il record in questo modo:

    codice:
    grigliaGioco.get(new Coordinate(0,0));
    Detto questo, non sarebbe meglio usare i contenitori generics come HashMap? Almeno avresti il controllo dei tipi.
    ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Caiodark
    Quando usi un array associativo, e hashtable lo è, la classe che fa da chiave deve implementare il metodo equals altrimenti java non è in grado di capire se due istanze rappresentano lo stesso valore.
    Fatto questo, potrai recuperare il record in questo modo:

    codice:
    grigliaGioco.get(new Coordinate(0,0));
    puntualizzo solo una cosa: usando le Collection e Map è bene per chiavi/valori implementare sempre i metodi equals e hashcode (e qui puoi leggere tanti documenti in rete sull'argomento e su come implementarli): è usare questi due metodi insieme che assicura l'unicità di un oggetto, non solo equals!
    Non è obbligatorio implementare equals e hashcode con i valori di una Map, anche se io preferisco comunque metterci la mia implementazione per evitare casini quando da una hashmap faccio

    codice:
    mappa.values();
    riguardo i generics...in realtà quell'operazione che hai scritto non crea problemi anche se la fai senza usare i generics. L'uso dei generics ti torna utile quando fai operazioni di insert perché il compilatore fa un controllo sul tipo che passi o di get perché il compilatore controlla il tipo a cui assegni il risultato della get (evitando in alcuni casi dei cast o odiosi instanceof), ma se per curiosità tu mettessi Object come tipo dei generics (e lo puoi fare), a parte eventuali warning, vedi che il codice esegue correttamente e ti segnala in alcuni punti (tipo get) la richiesta di un cast esplicito.

    HashMap non è un contenitore generics, ma una implementazione di Map, sarebbe utile definire così:

    codice:
    Map<TitoChiave, TipoValore> mappa = new HashMap<TipoChiave, TipoValore>();
    se non ricordo male da java 7 (devo provare perché uso pesantemente la versione 6) puoi anche fare questo


    codice:
    Map<TitoChiave, TipoValore> mappa = new HashMap();
    e non perdi le info sui generics (la seconda è da verificare)
    RTFM Read That F*** Manual!!!

  4. #4
    Originariamente inviato da valia
    riguardo i generics...in realtà quell'operazione che hai scritto non crea problemi anche se la fai senza usare i generics. L'uso dei generics ti torna utile quando fai operazioni di insert perché il compilatore fa un controllo sul tipo che passi o di get perché il compilatore controlla il tipo a cui assegni il risultato della get
    Che è esattamente quello che sta cercando di fare, inserire e recuperare valori da una map.

    ma se per curiosità tu mettessi Object come tipo dei generics (e lo puoi fare), a parte eventuali warning, vedi che il codice esegue correttamente e ti segnala in alcuni punti (tipo get) la richiesta di un cast esplicito.
    Ma è meglio che rimanga una curiosità, è una pessima idea rinunciare al controllo dei tipi a compile time.
    ...

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

    Re: Chiave HashTable

    Originariamente inviato da loma
    Il mio problema è come faccio a recuperare poi la chiave??
    grigliaGioco.get(????).
    Tenendo presente tutto quello che già ti hanno detto, rispondo alla tua domanda (che non mi pare l'abbia ancora fatto qualcuno).

    Al di là del fatto che non si sa bene cosa voglia dire "recuperare una chiave" (visto che, solitamente, è tramite una chiave che si "recupera" un valore), tutte le Map mettono a disposizione il metodo keySet() che restituisce, appunto, il set di chiavi contenute nella mappa.

    Esempio:

    codice:
    HashMap<String,Integer> miaMamma = new HashMap<String,Integer>();
    ...   // popolo la mappa
    
    // Ottengo l'elenco di tutte le chiavi memorizzate nella mappa
    Set<String> keys = miaMappa.keySet();
    
    // Scorrendo il set di chiavi, recupero tutti i valori:
    for(String key : keys) {
       System.out.println(key + ": " + miaMappa.get(key));
    }
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    60
    Grazie a tutti per le risposte.. ho risolto mi bastava implementare l'hashcode e il metodo equals nella classe Coordinate che uso come chiave.

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.