compareTo 是如何工作的? (可比较的界面)Java 8

How does compareTo work? (Comparable Interface) Java 8

我不明白 compareTo 的概念。根据我的阅读,由于它是一个接口,我们可以决定一个对象与另一个对象的比较方式(我们定义一个对象大于、等于和小于另一个对象的含义)。但是当你使用 compareTo 方法时,它 returns 一个整数。这怎么联系?我们如何处理该整数?这如何连接到排序方法? 示例场景:您正在比较两个字符串。你想对它们进行排序,使字母最多的字符串排在最前面。 问题:如何设置?

http://www.javapractices.com/topic/TopicAction.do?Id=10 link 提供了实施 compareTo 的良好指南。

当您有一个 class 需要订购实例时,compareTo 会派上用场。当您实施 compareTo 时,您基本上是在告诉排序方法 class 的不同实例如何相互比较

假设您有一个 class 学生,他拥有一个整数年龄、双倍 GPA 和一个字符串名称,您真的可以按这些字段中的任何一个对学生的实例进行排序。但是,您决定要根据年龄排序。然后,您将根据年龄而不是其他两个字段将 compareTo 函数实现为 return 反馈。

按升序和降序对自定义对象列表进行排序

Java 提供了两个接口来使用 class:

的数据成员对对象进行排序

比较和 比较器接口

Java 比较界面

Java 比较接口用于对用户自定义的对象进行排序class。 此接口位于 java.lang 包中,仅包含一个名为 compareTo(Object) 的方法。 它仅提供单一排序序列,即您可以仅基于单个数据成员对元素进行排序。 public int compareTo(Object obj): 用于比较当前对象和指定对象。 我们可以对以下元素进行排序: 字符串对象 包装 class 个对象 用户定义的 class 个对象

Java 比较器接口

Java Comparator接口用于对用户自定义的对象进行排序class。 Collections class 提供了对集合元素进行排序的静态方法。 用于对 List 元素进行排序的 Collections class 方法 public void sort(List list, Comparator c): 用于通过给定的Comparator对List的元素进行排序。

参考文献: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();
         }
}

让我们直奔主题。想象一下,我们有一个 class K,我们定义为实现 Comparable<K>,并且有两个引用 ab class K

要知道 a 是否“小于 </code>b`,我们写 </p> <pre><code>if (a.compareTo(b) < 0) { // compareTo returned a negative number ,,, }

要知道 a 是否是 "equal to" b,我们写

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

并且要知道 a 是否是 "greater than" b,我们写

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

这样是不是有点明白了?