2016-11-11 3 views
0

Ich bin neu in Java und versuche, Java-Sammlungen zu lernen und versuche, Arraylist mit vergleichbaren Schnittstelle zu sortieren. Ich folge einigen Tutorials und kann nicht verstehen, was hier in der compareto() Methode passiert. Das ist mein Code.Wie compareTo() Methode funktioniert ArrayList Sortierung

Student.java

package arraylistexample; 

public class Student implements Comparable<Student>{ 
    private String studentName; 
    private int age; 
    private int rollno; 

    public Student(String studentName, int age, int rollno){ 
     this.studentName=studentName; 
     this.age=age; 
     this.rollno=rollno; 
    } 

    public String getStudent(){ 
     return studentName; 

    } 

    public int getAge(){ 
     return age; 
    } 

    public int getRollno(){ 
     return rollno; 
    } 

    public void setStudent(String Student){ 
     studentName=Student; 
    } 

    public void setAge(int age){ 
     this.age=age; 
    } 

    public void setRollno(int rollno){ 
     this.rollno=rollno; 
    } 


    public int compareTo(Student compares) { 
     int compareage=((Student)compares).getAge(); 
     /* For Ascending order*/ 
     return this.age-compareage; 

    } 


    public String toString() { 
     return "[ rollno=" + rollno + ", name=" + studentName + ", age=" + age + "]"; 
    } 
} 

ArrayListSorting.java

package arraylistexample; 

import java.util.*; 


public class ArrayListSorting { 
    public static void main(String[] args){ 
     ArrayList<Student> obj=new ArrayList<Student>(); 
     obj.add(new Student("Peter", 27,1)); 
     obj.add(new Student("John",26,7)); 
     obj.add(new Student("Jack",21,5)); 

     Collections.sort(obj); 

     for(Student str:obj){ 
      System.out.println(str); 
     } 
    } 

} 

Das Problem ist, ich kann nicht verstehen, wie caompareto() -Methode in der hier arbeitet. Ich habe gegoogelt und viele Tutorials gelesen. Aber hat keine klare Idee bekommen. Kann mir jemand helfen.

+1

'Collections.sort()' ruft 'compareTo()' auf, um die Elemente der Liste zu vergleichen. – Eran

+0

@Eran Vielen Dank. Dein Kommentar zeigt mir den Weg. :) – Lanka

Antwort

0

Wenn Sie eine compareTo Methode für Ihre Klasse schreiben, können Sie angeben, nach welchen Kriterien Ihr Programm entscheiden soll, welches der beiden Objekte dieser Klasse in der Reihenfolge zuerst angezeigt werden soll.

Wenn Sie keine compareTo Methode für Ihre Klasse schreiben, dann hat Ihr Programm nicht wissen, in welcher Reihenfolge in zwei Objekte zu setzen - und damit hat es keine Möglichkeit, eine ganze Menge von Objekten zu sortieren.

Wenn Sie jedoch in Ihrer Klasse eine compareTo-Methode schreiben und AND angeben, dass Ihre Klasse die Schnittstelle Comparable implementiert, kann Ihr Programm beliebig viele Objekte dieser Klasse sortieren.

Was das bedeutet ist, dass Sie entscheiden müssen, in welcher Reihenfolge Ihre Student Objekte erscheinen sollen. Vielleicht möchten Sie sie nach Rollennummer sortiert. Also schreibst du deine compareTo entsprechend, so.

public int compareTo(Student other) { 
    return rollno - other.rollno; 
} 

Diese besondere Methode wird

  • eine positive Zahl zurück, wenn der aktuelle Schüler eine höhere Rollennummer als die Schüler other,
  • eine negative Zahl, wenn der aktuelle Schüler eine untere Walze genannt hat Nummer als der Student other genannt.
  • Null, wenn Sie versuchen, einen Schüler mit sich selbst zu vergleichen.

So erfüllt es alle Kriterien, die eine compareTo Methode erfüllen muss; und es kann verwendet werden, um eine Gruppe von Studenten zu sortieren. Der tatsächliche Algorithmus, der für die Sortierung verwendet wird, ist in der -Methode verborgen. Sie müssen nicht wissen, was es ist - Sie müssen nur wissen, dass es Ihre compareTo Methode bei der Sortierung verwendet.

2

Von Oracle docs der compareTo Methode:

Vergleicht dieses Objekt mit dem angegebenen Objekt für Ordnung. Gibt eine negative ganze Zahl, eine Null oder eine positive ganze Zahl zurück, da dieses Objekt kleiner, gleich oder größer als das angegebene Objekt ist.

Wenn Sie die Methode für ein eigenes zusammengesetztes Objekt implementieren, erstellen Sie eine Möglichkeit, diese Objekte zu vergleichen.

Zum Beispiel:

A Student dem Namen "Peter" und ein "Student namens "Greg" - wer ist größer/kleiner?

Das liegt an Ihnen zu entscheiden ... Sie können entweder alphabetische Reihenfolge von Namen oder Alter oder eine andere Komponente/Mitglied/Logik zu entscheiden.

Edit: Wie in den Kommentaren von Eran erwähnt, ist die Art und Weise Collections.sort Werke compareTo Methode verwendet. Von der docs:

oder die angegebene Liste in aufsteigender Reihenfolge, nach der natürlichen Reihenfolge ihrer Elemente. Alle Elemente in der Liste müssen die Vergleichsschnittstelle implementieren. Darüber hinaus müssen alle Elemente in der Liste miteinander vergleichbar sein (das heißt, e1.compareTo (e2) darf keine ClassCastException für Elemente e1 und e2 in der Liste auslösen).

0

Wie compareTo

arbeitet Wenn die beiden Elemente (a, b) sind verglichen werden bereits in der richtigen Reihenfolge, a.compareTo (b) einen Wert zurückgeben, der < = 0 Also muss nichts passieren.

Wenn sie nicht in der richtigen Reihenfolge sind, ist der Rückgabewert> 0 und zeigt an, dass sie ausgetauscht werden müssen.

Also in Ihrem Fall Student-Objekt in Ihrer compareTo-Methode, deren Alter ist größer als Ihr Referenzobjekt (diese) Alter der Schüler sie ausgetauscht werden, um Standardsortierung, die aufsteigend ist.

0

Für Sammlungen eine compareTo Sortierfunktion wird verwendet, um festzustellen, ob object1 größer oder kleiner ist als object2 von

object1.compareTo(object2) 

tun Laut Dokumentation von Intger Objekts compareTo

den Wert 0, wenn dieser Integer ist gleich dem Argument Integer; ein Wert kleiner als 0, wenn diese Ganzzahl numerisch kleiner ist als das Argument Integer; und ein Wert größer als 0, wenn diese Ganzzahl numerisch größer als das Argument Integer (vorzeichenbehafteter Vergleich) ist.

Sie können eine ähnliche Dokumentation für String-Objekt finden. Dieselbe Vorgehensweise wird allgemein für alle Objekte verwendet.

So ist die Idee, dass die Methode compareTo in Ihrer Klasse im Grunde

  1. <0 wenn object1<object2
  2. =0 wenn object1=object2
  3. >0 wenn object1>object2
012 zurückkehren soll

Mit dieser Funktion kann das Collections API Objekte sortieren.


in Ihrem Fall So können Sie sehen,

public int compareTo(Student compares) { 
    int compareage=((Student)compares).getAge(); 
    /* For Ascending order*/ 
    return this.age-compareage; 

} 

verwendet wird, wo es den Vergleich der Schüler auf Basis ihres Alters ermöglicht.

Verwandte Themen