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.

  1. Implementar Comparable con la clase estoy de clasificación, o crear una nueva clase?
  2. ¿Cómo puedo crear una instancia de la SortedMap y pasar en el Comparador?
  3. ¿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.

¿Fue útil?

Solución

  1. La manera más sencilla es aplicar Comparable con sus objetos existentes, aunque se podría crear en su lugar un Comparator y se pasa a la SortedMap.
    Tenga en cuenta que Comparable y Comparator son dos cosas diferentes;una clase que implementa Comparable compara this a otro objeto, mientras que una clase de aplicación Comparator compara dos otros objetos.
  2. En el caso de implementar Comparable, usted no necesita pasar nada especial en el constructor.Solo llame new TreeMap<MyObject>(). (Editar: Salvo que por supuesto Maps se necesitan dos parámetros genéricos, no uno.Tonto de mí!)
    Si, en lugar de crear otro tipo de aplicación Comparator, pasar una instancia de la clase en el constructor.
  3. 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 ClassYouWantToSortComparable.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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top