compareTo如何工作? (可比接口)Java 8

时间:2017-11-21 04:41:46

标签: java comparable

我没有得到compareTo的概念。从我读到的,因为它是一个接口,我们决定如何将一个对象与另一个对象进行比较(我们定义一个对象大于,等于和小于另一个对象的含义)。但是当你使用compareTo方法时,它会返回一个整数。这怎么连接?我们怎么处理这个整数?这如何连接到排序方法? 示例方案:您正在比较两个字符串。你想对它们进行排序,以便首先使用字母最多的字符串。 问题:你如何设置?

3 个答案:

答案 0 :(得分:2)

让我们了解问题的核心。想象一下,我们有一个我们已经定义为实现K的课程Comparable<K>,以及两个课程ab的课程K

要知道a是否&#34;小于 b`,我们会写

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

要知道a是否等于&#34;等于&#34; b,我们写

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

要知道a是否&#34;大于&#34; b,我们写

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

这有点清楚吗?

答案 1 :(得分:1)

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

Java提供了两个接口,用于使用类的数据成员对对象进行排序:

可比较和 比较器接口

Java Comparable接口

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

Java Comparator界面

Java Comparator接口用于对用户定义的类的对象进行排序。 Collections类提供了用于对集合元素进行排序的静态方法。 用于排序List元素的Collections类的方法 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();
         }
}

答案 2 :(得分:0)

http://www.javapractices.com/topic/TopicAction.do?Id=10 此链接提供了有关实施compareTo的良好指导。

当你有一个需要订购实例的类时,compareTo会派上用场。当您实现compareTo时,您基本上是在告诉sortmethod您的类的不同实例如何与相互比较。

假设您有一个拥有整数Age,一个双GPA和一个字符串Name的类Student,您可以通过其中任何一个字段对Student的实例进行排序。但是,您决定要根据年龄进行排序。然后,您将实现compareTo函数以基于Age而不是其他两个字段返回反馈。