2017-11-21 8 views
-4

Ich bekomme nicht das Konzept von compareTo. Von dem was ich lese, da es eine Schnittstelle ist, müssen wir entscheiden, wie ein Objekt mit einem anderen verglichen wird (Wir definieren, was es bedeutet, dass ein Objekt größer als, gleich und kleiner als ein anderes Objekt ist). Wenn Sie jedoch die compareTo-Methode verwenden, wird eine ganze Zahl zurückgegeben. Wie verbindet sich das? Was machen wir mit dieser Ganzzahl? Wie verbindet sich dies mit der Sortiermethode? Beispielszenario: Sie vergleichen zwei Strings. Sie möchten sie sortieren, so dass die Zeichenfolge mit den meisten Buchstaben zuerst geht. Frage: Wie stellen Sie das auf?Wie funktioniert compareTo? (Comparable Interface) Java 8

+2

Haben Sie die [javadoc] (https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html) für "Comparable" gelesen? –

+0

Ich habe es gelesen, und ich habe andere Dokumentation gelesen und andere haben versucht, es mir zu erklären, aber aus irgendeinem Grund kann ich einfach nicht meinen Kopf drumherum ... – kkn

+0

Was ist damit verwirrend Sie am meisten? –

Antwort

0

Kommen wir zum Kern der Sache richtig machen. Stellen Sie sich vor, wir haben eine Klasse K, die wir als Implementierung Comparable<K> definiert haben, und zwei Referenzen a und b für Objekte der Klasse K.

Um zu wissen, ob a ist „weniger als b`, wir

schreiben
if (a.compareTo(b) < 0) { 
    // compareTo returned a negative number 
    ,,, 
} 

Um zu wissen, ob a ist "gleich" b wir

if (a.compareTo(b) == 0) { 
    // compareTo returned zero 
    ... 
} 

schreiben und wissen, ob a ist "größer als" b, schreiben wir

if (a.compareTo(b) > 0) { 
    // compareTo returned a positive integer 
    ... 
} 

Macht das etwas klar?

+0

Ja, das klärt die Dinge ein wenig auf, danke. Wie verhält es sich mit der Sortiermethode? Sagen wir, wenn ich eine Liste mit den Objekten a und b sortiere, wenn ich die Liste so sortieren möchte, dass der "größere als" der beiden zuerst kommt, verwende ich dann das dritte Bit des Codes? – kkn

+0

Wenn Sie die Sortierroutine selbst schreiben, dann verwenden Sie dieses dritte Muster, um zu entscheiden, dass "a" vor "b" sortieren soll. –

0

http://www.javapractices.com/topic/TopicAction.do?Id=10 Dieser Link enthält gute Richtlinien zur Implementierung von compareTo.

Wenn Sie eine Klasse haben, die Sie bestellen müssen, ist compareTo praktisch. Wenn Sie compareTo implementieren, teilen Sie der Sortiermethode im Wesentlichen mit, wie sich verschiedene Instanzen Ihrer Klasse mit miteinander vergleichen.

Angenommen, Sie hätten eine Klasse Student, die eine ganzzahlige Age, eine doppelte GPA und einen String-Namen besitzt, könnten Sie Instanzen von Student wirklich nach einem dieser Felder sortieren. Sie entscheiden jedoch, dass Sie nach dem Alter sortieren möchten. Sie würden dann die compareTo-Funktion implementieren, um eine Rückmeldung basierend auf dem Alter anstelle der anderen beiden Felder zurückzugeben.

+0

Wenn ich Sie wäre, würde ich eine Follow-up-Frage stellen, die sich auf Ihr Beispielszenario konzentriert. Verwenden Sie geeignete Tags und fragen Sie speziell nach der Verwendung und Implementierung einer Sortiermethode und einer compareTo-Methode ... – errrck

1

Liste sortieren von benutzerdefinierten Objekten in auf- und absteigender Reihenfolge

Java bietet zwei Schnittstellen Objekte zu sortieren, unter Verwendung von Daten aus der Klasse:

Vergleichbare und Vergleicher Schnittstellen

Java Interface Comparable

Java Vergleichbare Schnittstelle wird verwendet, um die Objekte der benutzerdefinierten Klasse zu ordnen. Diese Schnittstelle befindet sich im java.lang-Paket und enthält nur eine Methode namens compareTo (Object). Es gibt nur eine Sortierreihenfolge, d. H. Sie können die Elemente basierend auf nur einem Datenelement sortieren. public int compareTo (Objektobjekt): wird verwendet, um das aktuelle Objekt mit dem angegebenen Objekt zu vergleichen. Wir können die Elemente sortieren: String-Objekte Wrapper Klassenobjekte Benutzerdefinierte Klasse

Java Vergleicher Schnittstelle

Java Komparator-Schnittstelle verwendet Objekte, die Objekte von benutzerdefinierten Klasse zu bestellen. Die Collections-Klasse bietet statische Methoden zum Sortieren der Elemente der Auflistung. Methode der Collections-Klasse zum Sortieren von Listenelementen public void sort (Listenliste, Comparator c): wird verwendet, um die Elemente von List nach dem angegebenen Comparator zu sortieren. Referenzen

: http://corejavapractical.blogspot.in/2017/08/algorithms-in-java.html

package com.mycompany.projectname.corejava; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.Date; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.ListIterator; 
import java.util.concurrent.CopyOnWriteArrayList; 


public class AlgorithmsDemo { 

     public static void main(String[] args) { 
       //sortingCustomObjectsByComparable(); 
       sortingCustomObjectsByComparator(); 
     } 


     private static void sortingCustomObjectsByComparable(){ 

       // Sort Projects by project id in ascending order. 

       List projects = new ArrayList<>(); 
       Project project = new Project(); 
       project.setProjectId(100); 
       project.setProjectName("project 100"); 
       projects.add(project); 

       Project project2 = new Project(); 
       project2.setProjectId(200); 
       project2.setProjectName("project 200"); 
       projects.add(project2); 

       Project project3 = new Project(); 
       project3.setProjectId(50); 
       project3.setProjectName("project 50"); 
       projects.add(project3); 

       Collections.sort(projects); 

       printList(projects); 

     } 

     private static void sortingCustomObjectsByComparator(){ 

       // Sort Projects by project id in ascending order. 

       List projects = new ArrayList<>(); 
       Project project = new Project(); 
       project.setProjectId(100); 
       project.setProjectName("project 100"); 
       projects.add(project); 

       Project project2 = new Project(); 
       project2.setProjectId(200); 
       project2.setProjectName("project 200"); 
       projects.add(project2); 

       Project project3 = new Project(); 
       project3.setProjectId(50); 
       project3.setProjectName("project 50"); 
       projects.add(project3); 

       // Sorting project by project id in ascending order in Java 
       Collections.sort(projects); 
       printList(projects); 

       // Sorting project by project id in descending order in Java 
     Collections.sort(projects, Collections.reverseOrder()); 
     printList(projects); 


    // Sorting project by project name in ascending order in Java 
      Comparator comparator = new Comparator() { 
       @Override 
       public int compare(Project o1, Project o2) { 
        // TODO Auto-generated method stub 
        return o1.getProjectName().compareTo(o2.getProjectName()); 
       } 
      }; 
      Collections.sort(projects, comparator); 
      printList(projects); 

     } 

     private static void printList(List projects){ 
       for(Project project : projects){ 
          System.out.println(project.getProjectId()); 
          System.out.println(project.getProjectName()); 
       } 
     } 

} 

class Project implements Comparable{ 
     private int projectId; 
     private String projectName; 
     public int getProjectId() { 
       return projectId; 
     } 
     public void setProjectId(int projectId) { 
       this.projectId = projectId; 
     } 
     public String getProjectName() { 
       return projectName; 
     } 
     public void setProjectName(String projectName) { 
       this.projectName = projectName; 
     } 
     @Override 
     public int compareTo(Project o) { 
       // TODO Auto-generated method stub 
       return this.projectId - o.getProjectId(); 
     } 
} 
Verwandte Themen