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

    Domanda su ordinamento dati in HashSet

    ciao!

    iterando su un json, ho provato ad aggiungere dati ad un HashSet.
    solo che non capisco perchè l'ordine che c'è nell'HashSet è diverso da quello che mi stampa l'iterazione.
    cioè:
    codice:
                    HashSet<String> header = lettura.getHeader();
                    for (String s : header) {
                        System.out.println(s);
                    }
    ----------------------
    ragSoc
    localita
    codFiscale
    tipoConto
    provincia
    via
    npu
    codiceTmp
    cap
    npuAgenda
    nazione
    ie
    telefono
    partIva
    codiceCliente
    breve
    mentre nell'iterazione sul json:
    codice:
            while ((token = parser.nextToken()) != JsonToken.END_OBJECT) {
                token = parser.nextToken();
                header.add(parser.getCurrentName());
                System.out.println(parser.getCurrentName());
            }
    -------------------------------
    npu
    npuAgenda
    codiceCliente
    codiceTmp
    tipoConto
    ragSoc
    breve
    partIva
    codFiscale
    via
    localita
    cap
    nazione
    provincia
    ie
    telefono
    sapete darmi una spiegazione??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    HashSet memorizza i dati utilizzando come chiave l'hash dell'oggetto (che, se ben costruito, sparpaglia gli oggetti per bene all'interno del range dei numeri interi)... di conseguenza, all'interno di un HashSet non ti devi aspettare (e non troverai mai, se l'hash è ben fatto) alcun ordinamento dei dati.

    Se hai bisogno di una collezione che mantenga un ordinamento logico, devi cambiare struttura: TreeSet, per esempio, mantiene gli oggetti ordinati secondo il loro natural order (o secondo l'ordinamento dato dal Comparator passato al suo costruttore).

    Se l'unico ordine di cui hai bisogno è quello di inserimento, un banale ArrayList.

    Ciao.
    Ultima modifica di LeleFT; 02-08-2017 a 15:03
    "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

  3. #3
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    HashSet memorizza i dati utilizzando come chiave l'hash dell'oggetto (che, se ben costruito, sparpaglia gli oggetti per bene all'interno del range dei numeri interi)... di conseguenza, all'interno di un HashSet non ti devi aspettare (e non troverai mai, se l'hash è ben fatto) alcun ordinamento dei dati.

    Se hai bisogno di una collezione che mantenga un ordinamento logico, devi cambiare struttura: TreeSet, per esempio, mantiene gli oggetti ordinati secondo il loro natural order (o secondo l'ordinamento dato dal Comparator passato al suo costruttore).

    Se l'unico ordine di cui hai bisogno è quello di inserimento, un banale ArrayList.

    Ciao.
    ciao LeleFT!

    si infatti in genere uso un ArrayList.
    ma avrei bisogno di una lista che non tenga conto dei duplicati.
    quindi avevo pensato ad uno dei vari "Set".

    a meno che non sia possibile ottenere la stessa cosa con ArrayList.

    cmq io avrei bisogno di una lista di String, che non tenga duplicati e che sia ordinata come in inserimento.
    cosa posso usare?

  4. #4
    ho visto che esiste LinkedHashSet che dovrebbe fare quello che mi serve!

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Si può ottenere lo stesso risultato anche usando un semplice ArrayList, con l'aggiunta della logica del Set:

    codice:
    ArrayList<String> lista = new ArrayList<String>();
    ...
    while( ... ) {
       String strDaInserire = ...;
       if ( !lista.contains(strDaInserire) ) {
          lista.add( strDaInserire );
       }
    }

    Non è efficente come le altre implementazioni di Set, ma se il numero di oggetti da inserire nella lista non è esorbitante, fa il suo sporco lavoro.


    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
    ok perfetto, grazie!!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.