Java:SortedMap, TreeMap, Comparables?Cómo utilizar?
-
10-07-2019 - |
Pregunta
Tengo una lista de objetos que necesito para ordenar de acuerdo a las propiedades de uno de sus campos.He oído que SortedMap y Comparadores son la mejor manera de hacer esto.
- Implementar Comparable con la clase estoy de clasificación, o crear una nueva clase?
- ¿Cómo puedo crear una instancia de la SortedMap y pasar en el Comparador?
- ¿Cómo funciona el trabajo de ordenación?Se ordenan automáticamente de todo, como a los objetos que se insertan?
EDITAR: Este código me da un error:
private TreeMap<Ktr> collection = new TreeMap<Ktr>();
(Ktr implementa Comparator<Ktr>
).Eclipse dice que está esperando algo como TreeMap<K, V>
, de modo que el número de parámetros estoy proporcionando es incorrecta.
Solución
- La manera más sencilla es aplicar
Comparable
con sus objetos existentes, aunque se podría crear en su lugar unComparator
y se pasa a laSortedMap
.
Tenga en cuenta queComparable
yComparator
son dos cosas diferentes;una clase que implementaComparable
comparathis
a otro objeto, mientras que una clase de aplicaciónComparator
compara dos otros objetos. - En el caso de implementar
Comparable
, usted no necesita pasar nada especial en el constructor.Solo llamenew TreeMap<MyObject>()
. (Editar: Salvo que por supuestoMaps
se necesitan dos parámetros genéricos, no uno.Tonto de mí!)
Si, en lugar de crear otro tipo de aplicaciónComparator
, pasar una instancia de la clase en el constructor. - Sí, de acuerdo a la
TreeMap
Javadocs.
Editar: En la re-lectura de la pregunta, nada de esto tiene sentido.Si usted ya tiene una lista, lo más sensato es implementar Comparable
y, a continuación, llamar a Collections.sort
en él.No hay mapas necesarios.
Un poco de código:
public class MyObject implements Comparable<MyObject> {
// ... your existing code here ...
@Override
public int compareTo(MyObject other) {
// do smart things here
}
}
// Elsewhere:
List<MyObject> list = ...;
Collections.sort(list);
Como con la SortedMap
, usted podría crear en su lugar un Comparator<MyObject>
y se pasa a Collections.sort(List, Comparator)
.
Otros consejos
1.
Eso depende de la situación. Digamos que el objeto A debe clasificarse antes que el objeto B en su conjunto. Si generalmente tiene sentido considerar A menos que B, la implementación de Comparable tendría sentido. Si el orden solo tiene sentido en el contexto en el que usa el conjunto, entonces probablemente debería crear un Comparador.
2.
new TreeMap(new MyComparator());
O sin crear una clase MyComparator:
new TreeMap(new Comparator<MyClass>() {
int compare(MyClass o1, MyClass o2) { ... }
});
3. Sí.
Dado que tiene una lista y obtiene un error porque tiene un argumento en el mapa, supongo que desea un conjunto ordenado:
SortedSet<Ktr> set = new TreeSet<Ktr>(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 desea retroceder, puede usar NavigableSet .
Mi respuesta asume que está utilizando la implementación TreeMap
de SortedMap
.
1.) Si usa Comparable
, tiene una opción. Puede implementar Comparator
directamente en su clase o pasar un <=> separado al constructor.
2.) Ejemplo:
Comparator<A> cmp = new MyComparator();
Map<A,B> map = new TreeMap<A,B>(myComparator);
3.) Sí, eso es correcto. Internamente TreeMap usa un árbol rojo-negro para almacenar elementos en orden a medida que se insertan; el costo de tiempo de realizar una inserción (o recuperación) es O (log N).
Hacer una Comparator<ClassYouWantToSort>
.A continuación, el Comparador compara el campo que desea ordenar.
Cuando se crea el TreeMap
, crear un TreeMap<ClassYouWantToSort>
, y pasa en el Comparator
como argumento.Entonces, como insertar objetos de tipo ClassYouWantToSort
, el TreeMap
utiliza su Comparator
para ordenarlos correctamente.
EDITAR:Como Adamski notas, también se puede hacer ClassYouWantToSort
sí Comparable
.La ventaja es que vas a tener menos clases a tratar, el código es más simple, y ClassYouWantToSort
consigue un conveniente que el orden predeterminado.La desventaja es que ClassYouWantToSort
no puede haber una sola obvio pedido, y por lo que tendrá que implementar Comparables
para otras situaciones de todos modos.Usted también puede no ser capaz de cambiar ClassYouWantToSort
.
EDIT2:Si sólo tienes un montón de objetos que vas lanzando en la colección, y no es un Map
(es decir,no es una asignación de un conjunto de objetos a otro), a continuación, usted desea un TreeSet
, no TreeMap
.