2012-05-20 32 views
8

Ho classe in cui sto classificando una lista.java sort usando la classe anonima

import java.util.*; 

public class First 
{ 

    private static HashMap<String,Second> msgs; 

    public static void main(String[] args) 
    {   

    List<String> ls=new ArrayList<String>(); 


    ls.add("fourth"); 
    ls.add("2"); 
    ls.add("second"); 
    ls.add("first"); 
    ls.add("third"); 
    ls.add("1"); 

    Iterator it=ls.iterator(); 

    // before sorting 
    while(it.hasNext()) 
    { 
    String s=(String)it.next(); 
    System.out.println(s); 
    } 

    Collections.sort(ls, new Comparator(){ 
     public int compare(Object o1, Object o2) { 
      return -1; 
      // it can also return 0, and 1 
     } 
    }); 

System.out.println(" "); 

//after sorting 
    Iterator iti=ls.iterator(); 
    while(iti.hasNext()) 
    { 
    String s=(String)iti.next(); 

    System.out.println(s); 
    } 

} 


} 

Dopo che il programma viene eseguito, ottengo questi valori:

1  
third 
first 
second 
2 
fourth 

La mia domanda è che cosa è il comportamento di Collection.sort() la funzione qui. Al ritorno -1 dalla funzione di confronto, otteniamo l'ordine inverso della lista. Allora come possiamo ottenere altri ordinamenti? Qual è il ruolo di ritorno 0 e 1?

+0

Cosa vuoi come output? –

risposta

8

Infine, ho modificato la funzione di ordinamento in questo modo per ottenere dati ordinati.

Collections.sort(ls, new Comparator() 
          { 

          public int compare(Object o1, Object o2) 
          { 
          String sa = (String)o1; 
          String sb = (String)o2; 

          int v = sa.compareTo(sb); 

          return v;   

           // it can also return 0, and 1 
          } 
          }  
        ); 
6

Ecco cosa the javadoc dice:

int confrontare (T o1, o2 T)

raffronta la sua due argomenti per l'ordine. Restituisce un numero intero negativo, zero o un numero intero positivo poiché il primo argomento è inferiore a, uguale a o superiore al secondo.

L'implementazione del comparatore non rispetta questo contratto, pertanto il risultato è indeterminato. Deve restituire un valore negativo se considera o1 minore di o2. Deve restituire un valore positivo se considera o1 maggiore di o2. E deve restituire 0 se considera o1 uguale a o2. E ovviamente deve essere coerente. Se o1 < o2, quindi o2> o1. Se o1 < o2 e o2 < o3, quindi o1 < o3.

4

Qual è il ruolo di ritorno 0 e 1?

Significa che o1 è uguale a o2 oppure o1 è maggiore di o2.

Il tuo comparatore anonima attualmente dice che o1 è inferiore a o2, per ogni possibile valore della o1 e o2. Questo semplicemente non ha senso e causa il comportamento di sort a essere imprevedibile.

Un valido comparatore deve implementare il metodo compare(Object, Object) modo che si comporti secondo le esigenze dell'interfaccia Comparator.


Se il vostro vero obiettivo è quello di invertire l'ordine degli elementi in una lista, allora non usare sort. Utilizzare Collections.reverse()

1

da Javadoc del comparatore

Compares its two arguments for order. Returns a negative integer, 
zero, or a positive integer as the first argument is less than, equal 
to, or greater than the second. 

Così definiscono la funzionalità del minore, uguale o maggiore di per la classe, si sta perdendo uguale e superiore a funzionalità.

4

java.util.Comparator classe dice compare metodo java doc:

un intero negativo, zero o un numero intero positivo come primo argomento è inferiore, uguale o superiore alla seconda .

è possibile utilizzare il codice seguente:

Collections.sort(ls, new Comparator() 
{ 
    public int compare(Object o1, Object o2) 
    { 
     if(o1 instanceof String && o2 instanceof String) 
     { 
      String s_1 = (String)o1; 
      String s_2 = (String)o2; 

      return s_1.compareTo(s_2); 
     } 
     return 0;  
    } 
}); 

Questo codice deve funzionare fine.You può cambiare metodo di confronto per una maggiore flessibilità.

compareTo metodo nella classe String dice nel suo documento java:

valore 0 se la stringa argomento è uguale a questa stringa; un valore inferiore a 0 se questa stringa è lessicograficamente inferiore all'argomento stringa; e un valore superiore a 0 se questa stringa è lessicograficamente maggiore dell'argomento stringa.

4

È possibile utilizzare classe anonima in questo modo:

TreeSet<String> treeSetObj = new TreeSet<String>(new Comparator<String>() { 
    public int compare(String i1,String i2) 
    { 
     return i2.compareTo(i1); 
    } 
}); 
Problemi correlati