2012-05-20 17 views
8

Ich habe Klasse, in der ich eine Liste sortiere.Java-Sortierung mit anonymer Klasse

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); 
    } 

} 


} 

Nachdem das Programm ausgeführt wird, erhalte ich diese Werte:

1  
third 
first 
second 
2 
fourth 

Meine Frage ist, was das Verhalten von Collection.sort ist() Funktion hier. Bei der Rückgabe von -1 aus der Vergleichsfunktion erhalten wir die umgekehrte Reihenfolge der Liste. Wie können wir andere Sortieraufträge bekommen? Welche Rolle spielt die Rückgabe von 0 und 1?

+0

Was möchten Sie als Ausgabe wollen? –

Antwort

8

Schließlich habe ich die Sortierfunktion auf diese Weise geändert, um sortierte Daten zu erhalten.

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

Hier ist, was the javadoc sagt:

int vergleichen (T o1, T o2)

Vergleicht seine beiden Argumente für Ordnung. Gibt eine negative ganze Zahl, eine Null oder eine positive ganze Zahl zurück, wenn das erste Argument kleiner als, gleich oder größer als die zweite Zahl ist.

Ihre Komparator-Implementierung respektiert diesen Vertrag nicht, daher ist das Ergebnis unbestimmt. Es muss einen negativen Wert zurückgeben, wenn o1 kleiner als o2 ist. Es muss einen positiven Wert zurückgeben, wenn es o1 als größer als o2 ansieht. Und es muss 0 zurückgeben, wenn es annimmt, dass o1 gleich o2 ist. Und es muss natürlich konsistent sein. Wenn o1 < o2, dann o2> o1. Wenn o1 < o2 und o2 < o3, dann o1 < o3.

4

Welche Rolle spielt die Rückgabe von 0 und 1?

Es ist zu sagen, dass der o1 gleich o2 oder o1 größer als o2 ist.

Ihr anonymer Komparator sagt derzeit, dass o1 weniger als o2, für jeden möglichen Wert von o1 und o2. Dies macht einfach keinen Sinn und verursacht das Verhalten von sort unvorhersehbar.

A gültig Komparator muss die compare(Object, Object) Methode implementieren, so dass es entsprechend den Anforderungen der Comparator Schnittstelle verhält.


Wenn Ihr eigentliches Ziel, die Reihenfolge der Elemente in einer Liste rückgängig zu machen ist, dann verwenden Sie nicht sort. Verwenden Collections.reverse()

1

von Javadoc von Vergleicher

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. 

So definieren die Funktionalität von kleinen, gleich oder größer ist als für die Klasse, die Sie vermissen gleich und größer als Funktionalität.

4

java.util.Comparator Klasse sagt in compare Verfahren Java doc:

eine negative ganze Zahl, Null oder eine positive ganze Zahl als erste Argument kleiner als, gleich oder größer als der zweite .

können Sie folgenden Code verwenden:

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;  
    } 
}); 

Dieser Code muss arbeiten fine.You ändern Methode für mehr Flexibilität zu vergleichen.

compareTo Methode in String Klasse sagt in seiner Java-doc:

den Wert 0, wenn das Argument Zeichenfolge diese Zeichenfolge gleich ist; ein Wert kleiner als 0, wenn diese Zeichenkette lexikografisch kleiner als das String-Argument ist; und ein Wert größer als 0, wenn diese Zeichenfolge lexikografisch größer als das Zeichenfolgenargument ist.

4

Sie können auf diese Weise anonyme Klasse verwenden:

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