2012-05-25 15 views
86

Un set Java conserva l'ordine? Un metodo restituisce un Set per me e presumibilmente i dati sono ordinati ma iterando sul Set, i dati non sono ordinati. C'è un modo migliore per gestirlo? Il metodo deve essere cambiato per restituire qualcosa di diverso da un Set?Java Imposta l'ordine di conservazione?

+1

" Gli elementi vengono restituiti in nessun ordine particolare (a meno che questo set è un'istanza di una classe che fornisce una garanzia)." è ciò che dice il metodo iteratore per un set. trovato [qui] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Set.html) – keyser

risposta

140

L'interfaccia Set non fornisce alcuna garanzia di ordinazione.

La sotto interfaccia, SortedSet, rappresenta un set che viene ordinato secondo alcuni criteri. In Java 6, esistono due contenitori standard che implementano SortedSet. Sono TreeSet e ConcurrentSkipListSet.

Oltre all'interfaccia SortedSet, è presente anche la classe LinkedHashSet. Ricorda l'ordine in cui gli elementi sono stati inseriti nell'insieme e restituisce i suoi elementi in quell'ordine.

+14

Inoltre, a causa del [diverso String hashing] (http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/10361) in Java 8, l'ordinamento predefinito (non ordinato) in Set e le mappe cambieranno. Se si fa affidamento su ordinamenti non ordinati, il proprio codice si comporterà diversamente in Java 8. – rustyx

50

LinkedHashSet è quello che ti serve.

+39

Un 'Elenco' non è un' Set' (non garantisce unicità dell'appartenenza). –

+3

In molti casi aziendali, l'elenco non può essere utilizzato solo per conservare l'ordine anziché il set. LinkedHashSet mantiene ordine e archivi unici. – gubs

8

Set è solo un'interfaccia. Per mantenere l'ordine, è necessario utilizzare un'implementazione specifica di tale interfaccia e l'interfaccia secondaria SortedSet, ad esempio TreeSet o LinkedHashSet. Si può avvolgere la Set in questo modo:

Set myOrderedSet = new LinkedHashSet(mySet); 
3

Dal javadoc per Set.iterator():

restituisce un iteratore sugli elementi in questo set. Gli elementi vengono restituiti senza un ordine particolare (a meno che questo insieme non sia un'istanza di una classe che fornisce una garanzia).

E, come già detto da shuuchan, un TreeSet è Un'implementazione di Set che ha un ordine garantito:

Gli elementi vengono ordinati tramite loro ordinamento naturale, o da un comparatore forniti a creazione dei tempo, a seconda del costruttore utilizzato.

3

Normalmente impostato non mantiene l'ordine, come ad esempio HashSet al fine di trovare rapidamente un emelent, ma si può provare LinkedHashSet manterrà l'ordine che si mette in.

0

Il set interfaccia stessa non prevede alcuna ordine particolare. Lo SortedSet tuttavia.

7

Per conservare l'ordine, utilizzare List o LinkedHashSet.

+1

È 'LinkedHashSet', non ...' Mappa'. –

+0

oops ... Grazie per l'individuazione. – JHS

-1

Solo SortedSet può fare l'ordine del Set

+0

La domanda riguarda il mantenimento dell'ordine di inserimento (che capita di essere ordinato). – assylias

+0

E a proposito di TreeSet? – Danielson

2

Ecco un breve riassunto delle caratteristiche di ordine della norma Set implementazioni disponibili in Java:

  1. mantenere l'ordine di inserimento: LinkedHashSet e CopyOnWriteArraySet (thread-safe)
  2. mantenere gli elementi ordinati all'interno del set: TreeSet, EnumSet (specifico per enum s) e ConcurrentSkipListSet (thread-safe)
  3. non mantenere gli elementi in un ordine specifico: HashSet (quello che si è tentato)

Per il vostro caso specifico, è possibile ordinare gli elementi prima e poi usare uno qualsiasi di 1 o 2 (molto probabilmente LinkedHashSet o TreeSet). In alternativa e in modo più efficiente, è possibile aggiungere dati non ordinati a un TreeSet che si occuperà automaticamente dell'ordinamento.

9

Come molti membri suggeriscono utilizzare LinkedHashSet per mantenere l'ordine della raccolta. U può avvolgere il tuo set usando questa implementazione.

SortedSet applicazione può essere utilizzata per modo ordinato, ma per il vostro uso di scopo LinkedHashSet.

anche dalla documentazione,

"Questa implementazione di pezzi di ricambio propri clienti dalla non specificato, ordinamento generalmente caotico fornito da HashSet, senza incorrere l'aumento del costo associato con TreeSet. Può essere usato per produrre una copia di un set che ha lo stesso ordine come l'originale, a prescindere dalla realizzazione del set originale: "

Fonte: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html

Problemi correlati