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.
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.
Comparable
con sus objetos existentes, aunque en su lugar podría crear un Comparator
y pasarlo a SortedMap
. 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. 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!) Comparator
, pase una instancia de esa clase al constructor. 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
.