2011-08-07 18 views
6

Opción 1: Haga una lista que implemente Comparable y oriéntela usando collections.sort (Lista l) cada vez que agregue un valor. Opción 2: crear un TreeSet (que se mantiene ordenado todo el tiempo).Lista con comparables Vs TreeSet

¿Cuál será más rápido? Lo estoy preguntando porque List me da la opción de ListIterator que necesito en mi caso, ya que me permite agregar un elemento al iterar.

+0

Mi estructura de datos tendrá alrededor de 100-200 objetos personalizados. – aps

+0

¿con qué frecuencia planea actualizar su colección [relativamente a otros OPS]? Además, TreeSet evita duplicados, List does not, ¿cuál es su política sobre este tema? – amit

+0

lo siento, dije algo incorrecto. En realidad, mis colecciones se actualizarán con bastante frecuencia durante el 10% inicial del tiempo de ejecución del programa, después de eso ya no es necesario ordenarlas ya que la cantidad de objetos se volverá más o menos constante. Después de eso, actualizaré las propiedades de los objetos. – aps

Respuesta

13

Las diferencias más importantes:

Criterion  | List with Collections.sort | TreeSet 
----------------+----------------------------+--------- 
cost of adding | O(n log n)     | O(log n) 
equal sort keys | permitted     | eliminated as duplicates 
iteration  | bidirectional, can insert | unidirectional, can not insert 

Para insertar un elemento cuando se repite sin conseguir un ConcurrentModificationException, que puede hacer:

for (E e : new ArrayList<E>(collection)) { 
    // some other code 

    collection.add(anotherE); 
} 
2

Utilice TreeSet aquí.

Agregar a TreeSet es una operación log(n). Agregar a la lista es tiempo constante, pero ordenarlo es n log(n).

+1

insertando en TreeSet lo ordenará automáticamente, por lo que su registro (n) para treeset vs nlog (n) para ordenar la lista. –

3

Collections.sort utiliza una combinación en una especie modificada con Nlog (n) ordenar el tiempo. Si llama al método en cada adición, puede terminar con n^2log (n) tiempo. Mientras que la inserción en TreeSet está garantizada log (n). Entonces, si lo llama en cada adición, se convierte en n.log (n). Así que sugeriría usar TreeSet en su lugar. Pero TreeSet no permite duplicados, por lo que podría afectar su decisión.

Si usa List, en lugar de usar Collections.sort, hay una cosa que puede hacer para optimizar; como usted sabe, cada vez que inserta el elemento en la lista, la lista ya está ordenada, por lo que si utiliza la ordenación por inserción aquí obtendrá un mejor rendimiento, ya que la ordenación por inserción es mejor en esos casos.

+0

No necesito duplicados. Pero necesitaba agregar objetos a la colección mientras iteraba. Es por eso que estaba considerando List. – aps

Cuestiones relacionadas