Modo migliore per implementare il metodo di confronto del Comparatore in java?

Ho scritto un comparatore che ordina in ordine crescente, come di seguito. che funziona bene.

Collections.sort(resultList,new Comparator<MyModelClass>() {
            @Override
            public int compare(MyModelClass o1, MyModelClass o2) {
                Integer id1= o1.getId();
                Integer id2= o2.getId();
                if(id1 == null && id2 == null) {
                    return 0;               
                }else if(id1 != null && id2 == null) {
                    return -1;
                } else if (id1 == null && id2 != null) {
                    return 1;
                } else {                
                    return id1.compareTo(id2);
                }
            }
        });

è da implementare come questo? Si prega di aiutare me?

Grazie!

InformationsquelleAutor user1016403 | 2012-01-06



5 Replies
  1. 5

    Sembra buono per la leggibilità, ma un po ‘ più efficace potrebbe essere:

    public int compare(MyModelClass o1, MyModelClass o2) {
        Integer id1= o1.getId();
        Integer id2= o2.getId();
        if (id1 == null) {
            return id2 == null ? 0 : 1;
        }
        if (id2 == null) {
            return -1;
        }
        return id1.compareTo(id2);
    }

    o anche:

    public int compare(MyModelClass o1, MyModelClass o2) {
        Integer id1= o1.getId();
        Integer id2= o2.getId();
        if (id1 == null) {
            return id2 == null ? 0 : 1;
        }
    
        return id2 == null ? -1 : id1.compareTo(id2);
    }
    • Grazie per la risposta. per l’ordine decrescente semplicemente abbiamo bisogno di invertire il senso giusto? Si prega di rispondere.
    • Sì, è sufficiente passare id2 id1 per.
    • Come David Newcomb punti fuori, c’è il rischio di valori null nella lista, che erano sfuggiti alla mia mente. Prendere in considerazione i suoi consigli, come pure.
    • Se avete bisogno di implementare il secondo iteratore per l’ordinamento in ordine opposto utilizzare Collections.reverseOrder(Comparator<T> cmp) invece.
    • Grazie per il youre risposta. qual è la logica dietro l’ordinamento come ho fatto nel metodo compare (). Si prega di considerare che ho 5 Dipendenti oggetti e il loro id 20,10.40,20,50. ora, come fa ordinamento restituisce -1 o 0 o +1? si prega di aiutare me.
    • Algoritmi di ordinamento si basano sul confronto di due valori. Per ogni confrontare, -1 significa che o1 dovrebbe venire prima di o2 nell’ordinamento dei risultati, 0 significa che non importa, 1 mezzo dopo. L’algoritmo di ordinamento richiama compare() un numero sufficiente di volte per diversi oggetti per assicurarsi che l’elenco è del tutto risolti.

  2. 3

    Se avete bisogno di null-cassetta di sicurezza logica di confronto in diversi comparatori poi vorrei suggerire l’utilizzo di un supporto statico in una classe di utilità come questo:

    public static int compare(Comparable c1, Comparable c2) {
        return c1 == null
                   ? (c2 == null ? 0 : 1)
                   : (c2 == null ? -1 : c1.compareTo(c2));
    }

    Il Comparatore di poi, potrebbe essere semplificata per:

    public int compare(MyModelClass o1, MyModelClass o2) {
        return CompareHelper.compare(o1.getId(), o2.getId());
    }
  3. 1

    Se getId() restituisce un int, si può semplicemente andare con il ritorno id1.compareTo(id2), questo vi darà il giusto risultato. Spero che questo aiuta.

  4. 1

    No, non è una buona realizzazione.

    Java.util.Elenco specifiche dice che si può avere valori null in un elenco e, in alcuni casi, si può avere più valori null.
    Il Comparatore non riuscirà con un NullPointerException non appena si tenta di fare o?.getId() su un elemento null.

    Quello che io di solito fare è rendere la mia classe implement java.lang.Comparable, quindi posso usare una Mappa per ordinare gli elementi come li aggiungo. Uno ha in genere per creare l’elenco e allora perché non costruire un diagramma ad albero, invece?

    Se si riutilizza la tua classe e desidera ordinare in modi diversi, è possibile creare un TreeMap con un Comparator nel costruttore, quindi non c’è bisogno di esplicitamente ordinamento.

Lascia un commento