Java: SortedMap, TreeMap, Comparable? ¿Cómo utilizar?

Tengo una lista de objetos que necesito ordenar según las propiedades de uno de sus campos. He escuchado que SortedMap y los Comparadores son la mejor manera de hacer esto.

  1. ¿Implemente Comparable con la clase que estoy ordenando, o creo una nueva clase?
  2. ¿Cómo puedo crear una instancia de SortedMap y pasar en el comparador?
  3. ¿Cómo funciona la clasificación? ¿Clasificará automáticamente todo a medida que se inserten nuevos objetos?

EDITAR: Este código me está dando un error:

private TreeMap collection = new TreeMap(); 

(Ktr implementa Comparator ). Eclipse dice que está esperando algo como TreeMap , por lo que la cantidad de parámetros que estoy suministrando es incorrecta.

  1. La forma más simple es implementar Comparable con sus objetos existentes, aunque en su lugar podría crear un Comparator y pasarlo a SortedMap .
    Tenga en cuenta que Comparable y Comparator son dos cosas diferentes; una clase que implementa Comparable compara this con otro objeto, mientras que una clase que implementa Comparator compara otros dos objetos.
  2. Si implementa Comparable , no necesita pasar nada especial al constructor. Simplemente llame al new TreeMap() . ( Editar: Excepto que, por supuesto, Maps necesita dos parámetros generics, no uno. ¡Qué tonto!)
    Si en su lugar crea otra clase implementando el Comparator , pase una instancia de esa clase al constructor.
  3. Sí, según los TreeMap TreeMap .

Edit: Al releer la pregunta, nada de esto tiene sentido. Si ya tiene una lista, lo más sensato es implementar Comparable y luego llamar a Collections.sort . No se necesitan mapas.

Un pequeño código:

 public class MyObject implements Comparable { // ... your existing code here ... @Override public int compareTo(MyObject other) { // do smart things here } } // Elsewhere: List list = ...; Collections.sort(list); 

Al igual que con SortedMap , en su lugar, podría crear un Comparator y pasarlo a Collections.sort(List, Comparator) .

1.

Eso depende de la situación. Digamos que el objeto A debe ordenarse antes que el objeto B en su conjunto. Si por lo general tiene sentido considerar A menos de B, entonces la implementación de Comparable tendría sentido. Si la orden solo tiene sentido en el contexto en el que usa el conjunto, probablemente debería crear un Comparador.

2.

 new TreeMap(new MyComparator()); 

O sin crear una clase MyComparator:

 new TreeMap(new Comparator() { int compare(MyClass o1, MyClass o2) { ... } }); 

3. Sí.

Como tienes una lista y obtienes un error porque tienes un argumento en el mapa, supongo que quieres un conjunto ordenado:

 SortedSet set = new TreeSet(comparator); 

Esto mantendrá el conjunto ordenado, es decir, un iterador devolverá los elementos en su orden de clasificación. También hay métodos específicos para SortedSet que es posible que desee utilizar. Si también quiere retroceder, puede usar NavigableSet .

Mi respuesta asume que estás usando la implementación SortedMap de SortedMap .

1.) Si usa TreeMap , tiene una opción. Puede implementar Comparable directamente en su clase o pasar un Comparator separado al constructor.

2.) Ejemplo:

 Comparator cmp = new MyComparator(); Map map = new TreeMap(myComparator); 

3.) Sí, eso es correcto. Internamente TreeMap usa un árbol rojo-negro para almacenar los elementos en orden a medida que se insertan; el costo de tiempo de realizar una inserción (o recuperación) es O (log N).

Usted hace un Comparator . Luego, el Comparador compara el campo que desea ordenar.

Cuando crea el TreeMap , crea un TreeMap , y pasa el Comparator como un argumento. Luego, al insertar objetos del tipo ClassYouWantToSort , TreeMap usa su Comparator para ordenarlos correctamente.

EDITAR: Como señala Adamski, también puedes hacer que ClassYouWantToSort sea Comparable . La ventaja es que tiene menos clases con las que lidiar, el código es más sencillo y ClassYouWantToSort obtiene un pedido predeterminado conveniente. La desventaja es que ClassYouWantToSort puede no tener un solo pedido obvio, por lo que tendrá que implementar Comparables para otras situaciones de todos modos. También es posible que no pueda cambiar ClassYouWantToSort .

EDIT2: si solo tiene un montón de objetos que está lanzando a la colección, y no es un Map (es decir, no es un mapa de un conjunto de objetos a otro), entonces desea un TreeSet , no un TreeMap .