Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Ordinamento iterazione HashMap

    ciao!
    avrei una domanda sull'ordinamento di iterazione di HashMap.
    codice:
    HashMap<String, String> sheetsMap = new HashMap<String, String>();
    sheetsMap.put("ENTRATE", Const.LOCAL_PATH + Const.JSON_LAST_ENTRIES);
    sheetsMap.put("USCITE", Const.LOCAL_PATH + Const.JSON_LAST_RELEASES);
    Iterator<Entry<String, String>> it = sheetsMap.entrySet().iterator();
    while (it.hasNext()) {
                @SuppressWarnings("rawtypes")
                Map.Entry entry = (Map.Entry) it.next();
                System.out.println(entry.getKey().toString() + entry.getValue().toString());
            }
    i valori vengono stampati partendo da USCITE, sia che metto questa chiave all'inizio della lista che alla fine.
    potreste spiegarmi il perchè e in caso come potrei risolvere??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    i valori vengono stampati partendo da USCITE, sia che metto questa chiave all'inizio della lista che alla fine.
    potreste spiegarmi il perchè
    HashMap è unsorted/unordered. Vuol dire che gli elementi (le chiavi, per le map) non vengono mantenuti ordinati in base al loro contenuto e non c'è neanche un ordine di iterazione "prevedibile" e noto.
    Un ordine di iterazione "fisico" c'è ovviamente ma si basa sulla lista dei bucket nella hash-table interna. Per ogni bucket viene esaminata (se presente) la lista linkata delle entry in quel bucket. Evidentemente il valore di hashCode() di "USCITE" è tale da far stare l'entry in un bucket che è prima di quello per "ENTRATE".
    Nota: l'ordine di iterazione può anche cambiare man mano che si aggiungono elementi, quando avvengono operazioni di re-hashing per allungare la lista dei bucket.

    Quote Originariamente inviata da fermat Visualizza il messaggio
    e in caso come potrei risolvere??
    Es. TreeMap che sorted/ordered. sorted=le chiavi sono mantenute ordinate in base al loro contenuto e ordered=l'ordine di iterazione è prevedibile perché si basa appunto sull'ordine delle chiavi.
    Ultima modifica di andbin; 16-02-2014 a 18:20
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    perfetto, risolto con TreeMap:
    codice:
    TreeMap<String, String> sheetsMap = new TreeMap<String, String>();
    sheetsMap.put("ENTRATE", Const.LOCAL_PATH + Const.JSON_LAST_ENTRIES);
    sheetsMap.put("USCITE", Const.LOCAL_PATH + Const.JSON_LAST_RELEASES);
    Iterator<Entry<String, String>> it = sheetsMap.entrySet().iterator();
    while (it.hasNext()) {
                @SuppressWarnings("rawtypes")
                Map.Entry entry = (Map.Entry) it.next();
                System.out.println(entry.getKey().toString() + entry.getValue().toString());
            }
    grazie!!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    perfetto, risolto con TreeMap:
    grazie!!
    Prego, ma visto che hai usato i generics allora aggiungo 2 cose:

    - se hai bisogno (es. perché ti serve il remove() ) dell'iteratore esplicito, ok. Comunque puoi evitare quel @SuppressWarnings semplicemente tipizzando correttamente la variabile:

    Map.Entry<String,String> entry = it.next();

    - se non hai bisogno dell'iteratore esplicito, puoi usare il "for-each", che ti permette di fare in modo compatto:

    codice:
    for (Map.Entry<String,String> entry : sheetsMap.entrySet()) {
        ......
    }

    sotto-sotto produce sostanzialmente lo stesso identico codice.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    si in questo caso l'iteratore mi serve.
    quindi ho optato per Map.Entry<String, String> entry = it.next();
    grazie per il consiglio!!

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.