Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774

    [java] - oridnamento HashMap

    salve a tutti....
    devo riempire un hashMap con delle coppie <String><Object> ed ho qualche problema di ordinamento...
    in pratica: vorrei che l'hashmap restasse ordinato secondo l'ordine con cui io inserisco gli oggetti...
    lui invece me lo ordina in automatico mettendomi le chiavi in ordine alfabetico......

    sapete come posso fare per evitare questo inconveniente?
    le chiavi mi servono solo per fare delle ricerche all'interno dell'hashmap ma non voglio assolutamente che venga ordinato perchè devo poterlo scorrere anche dall'inzio alla fine secondo l'ordine con cui l'ho popolato...

    grazie a chiunque mi darà una dritta...
    citrus

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java] - oridnamento HashMap

    Originariamente inviato da citrus
    devo riempire un hashMap con delle coppie <String><Object> ed ho qualche problema di ordinamento...
    in pratica: vorrei che l'hashmap restasse ordinato secondo l'ordine con cui io inserisco gli oggetti...
    HashMap è una collezione definita "unordered" e "unsorted", in pratica non c'è alcun ordinamento!

    Originariamente inviato da citrus
    lui invece me lo ordina in automatico mettendomi le chiavi in ordine alfabetico......
    Sbagliato ... è solo un puro caso. Ripeto: una HashMap non ha alcun ordine di alcun tipo. Man mano che si inseriscono/eliminano elementi, l'ordine di iterazione può addirittura cambiare molto (pensa solo al fatto che la lista dei "bucket" si può espandere).

    Originariamente inviato da citrus
    sapete come posso fare per evitare questo inconveniente?
    le chiavi mi servono solo per fare delle ricerche all'interno dell'hashmap ma non voglio assolutamente che venga ordinato perchè devo poterlo scorrere anche dall'inzio alla fine secondo l'ordine con cui l'ho popolato...
    Hai 2 possibilità, vedi quale è meglio per te:

    A) Usare una TreeMap che è "sorted" e di conseguenza "ordered".
    All'interno di una TreeMap le chiavi sono mantenute ordinate tramite l'ordine naturale (Comparable) o tramite un ordine custom (Comparator). Pertanto essendo ordered la iterazione è fatta in modo ordinato, secondo quanto appena detto.

    B) Usare una LinkedHashMap che è "unsorted" ma è "ordered". L'ordine di iterazione è per "insertion-order" o per "access-order" (la scelta è fatta attraverso un costruttore specifico, vedi documentazione).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    scusa non ho capito una cosa...
    quando dici che l'hashmap non è ordinato...
    significa che mantiene l'ordine con cui l'ho popolato o che le chiavi si mischiano automaticamente secondo una logica a noi sconosciuta?

    perchè se è così allora credo che la soluzione migliore sia quella si usare il LinkedHashMap come dicevi tu...
    in ogni caso grazie mille x la dritta

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da citrus
    scusa non ho capito una cosa...
    quando dici che l'hashmap non è ordinato...
    significa che mantiene l'ordine con cui l'ho popolato o che le chiavi si mischiano automaticamente secondo una logica a noi sconosciuta?
    Non c'è alcun ordine preciso, nel senso che le chiavi sono completamente disordinate, non c'è alcuna logica precisa e per la iterazione delle chiavi si ottiene un ordine assolutamente imprevedibile. E che come ho già detto, può anche cambiare dopo inserimenti/eliminazioni.

    Per capire questa cosa dovresti capire come è gestita una "hash table", c'è una lista di "bucket" e la scelta del bucket da usare è fatta tramite il metodo hashCode implementato dall'oggetto.

    Comunque prova questo:
    codice:
    import java.util.*;
    
    public class Prova
    {
        public static void main (String[] args)
        {
            Map<String,Integer> map = new HashMap<String,Integer> ();
    
            map.put ("uno", 1);
            map.put ("due", 2);
            map.put ("tre", 3);
    
            for (Map.Entry<String,Integer> e : map.entrySet ())
                System.out.println (e.getKey () + " -> " + e.getValue ());
    
            map.put ("quattro", 4);
            map.put ("cinque", 5);
            map.put ("sei", 6);
    
            System.out.println ("-----");
    
            for (Map.Entry<String,Integer> e : map.entrySet ())
                System.out.println (e.getKey () + " -> " + e.getValue ());
        }
    }
    Output (qui sul mio PC):
    codice:
    tre -> 3
    due -> 2
    uno -> 1
    -----
    sei -> 6
    tre -> 3
    quattro -> 4
    cinque -> 5
    due -> 2
    uno -> 1
    L'ordine è assolutamente imprevedibile e come vedi ... cambia pure!!

    Ora nella prima riga del main, prova a mettere new TreeMap invece di new HashMap e rilancia il programma:
    codice:
    due -> 2
    tre -> 3
    uno -> 1
    -----
    cinque -> 5
    due -> 2
    quattro -> 4
    sei -> 6
    tre -> 3
    uno -> 1
    Ora le chiavi sono perfettamente ordinate secondo l'ordine alfabetico.

    Originariamente inviato da citrus
    perchè se è così allora credo che la soluzione migliore sia quella si usare il LinkedHashMap come dicevi tu...
    Se ti interessa l'ordine di inserimento allora sì, come scelta è ok.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di citrus
    Registrato dal
    Feb 2002
    Messaggi
    774
    sei stato chiarissimo grazie infinite
    ciao
    citruz

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    Ciao Ragazzi,

    io invece vorrei ordinare il mio HashMap in base a dei campi che ho negli oggetti che lo popolano. I campi che compongono i miei oggetti sono Nome e Cognome,come posso fare ? Non ho la + pallida idea!!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da melmar20
    io invece vorrei ordinare il mio HashMap in base a dei campi che ho negli oggetti che lo popolano. I campi che compongono i miei oggetti sono Nome e Cognome,come posso fare ? Non ho la + pallida idea!!
    Uhm ... ho come la sensazione che tutto ciò che ho detto non sia servito a nulla ....

    Ripeto per l'ennesima volta: una HashMap è unordered/unsorted, NON c'è alcun ordinamento né internamente né per la iterazione.

    Se si vuole avere una collezione il cui ordine sia mantenuto in base al contenuto dell'oggetto, bisogna usare una collezione "sorted". Sono principalmente due: TreeMap e TreeSet.

    Ammesso di voler usare un TreeMap per contenere degli oggetti di tipo Persona (che ha ad esempio due proprietà nome e cognome, tanto per fare un esempio) si devono fare le seguenti cose:
    A) Dichiarare che Persona implementa l'interfaccia Comparable.
    B) Implementare in Persona il metodo compareTo(), si veda la documentazione ufficiale per i dettagli del metodo, in modo da effettuare la comparazione secondo i criteri voluti.

    Comparable viene usato per gestire quello che normalmente si chiama "natural order", cioè l'ordine "naturale" dell'oggetto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    il problema è che devo necessariamente utilizzare un HashMap.

    Avevo pensato di inserire tutte le key dell'HashMap in un array ma ho cercato un metodo per farlo e non lo ho trovato.utilizzando eclipse mi viene suggerito il metodo .KeySet ma non penso a fare cio che voglio fare.

    Ricapitolando la mia intenzione era quella di :
    1)inserire tutte le key in un array ;
    2)Ordinare l'array e di conseguenza tutti gli object dell'HashMap;

    Di problemi ne ho trovati parecchi.Tanto per cominciare non trovo un metodo che mi permetta di inserire tutte le key in un Array.

    Aiuto!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Le chiavi dell'HashMap cosa sono? Devi ordinare in base alle chiavi o hai valori?
    Se ti puo' essere utile .keyset().toArray() restituisce un'array di object.
    P.s. perche' devi usare per forza un HashMap?

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    655
    ho visto che c'è il metodo toArray() che mette tutti gli indici in un Array ,ma poi come posso manipolare questi indici,per spiegarmi meglio ,come posso andare a leggere i valori che sono stati inseriti nell'Array?

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.