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?
risposta
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.
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
LinkedHashSet è quello che ti serve.
Un 'Elenco' non è un' Set' (non garantisce unicità dell'appartenenza). –
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
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);
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.
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.
Il set interfaccia stessa non prevede alcuna ordine particolare. Lo SortedSet tuttavia.
Per conservare l'ordine, utilizzare List
o LinkedHashSet
.
È 'LinkedHashSet', non ...' Mappa'. –
oops ... Grazie per l'individuazione. – JHS
Iterator restituito da Set non consente di restituire i dati in modo ordinato. Vai a questa Two java.util.Iterators to the same collection: do they have to return elements in the same order?
Ecco un breve riassunto delle caratteristiche di ordine della norma Set
implementazioni disponibili in Java:
- mantenere l'ordine di inserimento: LinkedHashSet e CopyOnWriteArraySet (thread-safe)
- mantenere gli elementi ordinati all'interno del set: TreeSet, EnumSet (specifico per enum s) e ConcurrentSkipListSet (thread-safe)
- 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.
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
- 1. Conservazione della sessione in Java con sendredirect
- 2. Conservazione di grandi numeri
- 3. assertEquals java imposta
- 4. Funzione Hash di conservazione delle località
- 5. Excel: formule di conservazione ClearContent
- 6. Conversione BSON Tipo ObjectId a JSON (conservazione in MongoDB) -Java
- 7. Conservazione del tipo Java di un oggetto quando lo si passa da Java a Jython
- 8. Imposta immagine icona in Java
- 9. Java, imposta ID per JButton
- 10. Java: imposta l'opacità in JPanel
- 11. Imposta valore su Enum - Java
- 12. struttura di conservazione dell'indicizzazione di array
- 13. Conservazione di caratteri speciali in xml
- 14. Deep clone in TypeScript (tipi di conservazione)
- 15. Conservazione dei dati in memoria
- 16. JSON-lib Fuggi-fuggi/conservazione stringhe
- 17. Java: incoerenze File.exists() quando si imposta "user.dir"
- 18. Come si imposta Java Opengl su eclipse?
- 19. NetBeans (Java Swing): Imposta dimensione finestra
- 20. Conservazione dello spazio bianco in un'opzione di selezione HTML
- 21. Imposta più proprietà di sistema Riga comandi Java
- 22. Imposta il livello di conformità del compilatore Java
- 23. Imposta livello di conformità Java in CXF wsdl2java
- 24. Conservazione della mappa sourc originale con Browserify
- 25. Conservazione della visualizzazione numpy durante il decapaggio
- 26. Conservazione della sreg negli interrupt AVR
- 27. Perché @FunctionalInterface ha una conservazione RUNTIME?
- 28. Stato di conservazione in un metodo di estensione
- 29. Ridimensionamento dell'area di lavoro e centro di conservazione
- 30. Ordine di colonna di conservazione - Pats e colonna Python Concat
" 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