Qual è la soluzione "buona" (e perché?) Per ottenere uno List
da un Set
e ordinato rispetto a un dato Comparator
?Come ottenere l'elenco da Set e Comparatore
risposta
Set<Object> set = new HashSet<Object>();
// add stuff
List<Object> list = new ArrayList<Object>(set);
Collections.sort(list, new MyComparator());
appena aggiunto COllections.sort() dopo quello. –
Risposta errata, questo non funzionerà in quanto il costruttore ArrayList non ordina nulla, non hai nemmeno usato il tuo Comparatore, quindi come sarà risolto? Utilizzare Collections.sort() o TreeSet, come in altre risposte. – iirekm
Hai risolto la risposta per includere la chiamata per ordinare. –
Costruirlo. Il ArrayList
ha un constructor taking another Collection
.
Set<Foo> set = new TreeSet<Foo>(new FooComparator<Foo>());
// Fill it.
List<Foo> list = new ArrayList<Foo>(set);
// Here's your list with items in the same order as the original set.
Questo è come ottenere un List
quando si ha un Set
:
List list = new ArrayList(set);
Non sei sicuro di quello che ci si aspetta di fare con il Comparator
. Se lo Set
è ordinato, l'elenco conterrà gli elementi ordinati.
Ovviamente si aspetta di usare il comparatore per ottenere una lista ordinata, il che implica che il set non è ordinato. Per che altro vorresti usare un comparatore? Quindi dovrebbe passare attraverso un set ordinato o ordinare l'elenco dopo averlo popolato. –
@Christoffer Hammarström - o ordinarlo quando/inserendo gli elementi uno ad uno: inserimento sort. – Ishtar
@Ishtar: che cosa succede se si passa attraverso un set ordinato, il mio primo suggerimento. –
O:
Set<X> sortedSet = new TreeSet<X>(comparator); ...
List<X> list = new ArrayList<X>(sortedSet);
o:
Set<X> unsortedSet = new HashSet<X>(); ...
List<X> list = new ArrayList<X>(unsortedSet);
Collections.sort(list, comparator);
Supponendo che si avvia con un insieme non ordinato o un set ordinato in un ordine diverso, il seguente è probabilmente la assumendo più efficiente che hai bisogno di una lista modificabile.
Set<T> unsortedSet = ...
List<T> list = new ArrayList<T>(unsortedSet);
Collections.sort(list, comparator);
Se un elenco non modificabile è accettabile, allora il seguente è un po 'più veloce:
Set<T> unsortedSet = ...
T[] array = new T[unsortedSet.size()];
unsortedSet.toArray(array);
Arrays.sort(array, comparator);
List<T> list = Arrays.asList(array);
Nella prima versione, Collections.sort(...)
Copia l'elenco contenuto a un array, ordina l'array e copia i elementi ordinati di nuovo alla lista. La seconda versione è più veloce perché non ha bisogno di copiare gli elementi ordinati.
Ma a dire il vero la differenza di prestazioni non è probabilmente significativa. Infatti, man mano che le dimensioni del set di input aumentano, le prestazioni saranno dominate dal tempo O(NlogN)
per eseguire l'ordinamento. I passaggi di copia sono O(N)
e ridurranno di importanza man mano che N cresce.
La tua versione con Arrays.sort infatti non ottimizza molto (o anche nulla), perché Collections.sort() contiene già codice simile: Object [] a = list.toArray(); Arrays.sort (a, (Comparatore) c); ListIterator i = list.listIterator(); per (int j = 0; j
@iirekm - l'uso di 'Arrays.asList (array)' evita la copia eseguita utilizzando l'iteratore di lista. –
Aaah, tale copia aggiuntiva può essere importante solo per i set di dati molto grandi. – iirekm
- 1. Java TreeMap (comparatore) e ottenere il metodo ignorando il comparatore
- 2. Utilizzando comparatore per STL set
- 3. Ottieni sottoset del set utilizzando il comparatore
- 4. È possibile cambiare il comparatore di un C++ std :: set?
- 5. Come ottenere inverso di un comparatore in java
- 6. Ottenere un elemento da un set Java
- 7. Come ottenere elementi casuali da un set in Swift?
- 8. Come ottenere un URL ALAsset da un set PHA?
- 9. come ottenere il set di risultati completo da SSMS
- 10. Come utilizzare correttamente il comparatore Java?
- 11. Come ottenere DIFF sul set ordinato
- 12. molti a molti e come ottenere un set di query da queryset
- 13. Come posso ottenere oggetti precedenti e successivi da un set di filtri, ordinato?
- 14. Quali sono le differenze tra Comparatore di ordinamento e Comparatore di gruppo in Hadoop?
- 15. Come si usa il comparatore con is_transparent type?
- 16. Java: Paragonabile vs comparatore
- 17. Comparatore lambda multilinea
- 18. Elenco :: contiene con comparatore
- 19. comparatore vs Apache BeanComparator
- 20. Comparatore analogico AVR + Pullup interno?
- 21. Comparatore Java TreeMap
- 22. Come rimuovere un elemento da un set?
- 23. Come ottenere un set univoco di righe da SQL dove l'univocità è definita da 2 colonne?
- 24. come testare il comparatore al test junit
- 25. L'ordinamento da parte di un comparatore non transitivo "funziona"?
- 26. Come ottenere il campo dei metadati del copyright da un MPMediaItem o da un set AVA?
- 27. come ottenere SecIdentityRef da SecCertificateRef e PrivateKey?
- 28. Ordinamento tramite Interfaccia comparatore e flussi java 8
- 29. Ottenere coppia-set utilizzando LINQ
- 30. comparatore con il doppio tipo
Questa domanda non è chiara. Ad esempio, posso ottenere una lista da un set e un comparatore ignorando il comparatore. Questa è una "buona" soluzione ... nel senso che è più veloce delle soluzioni che usano il Comparatore. –
@Stephen Ho aggiornato la mia domanda –
Sei sicuro di aver bisogno di una lista? Forse un SortedSet farebbe. –