请解说下CompareTo()与Compare()详细工作原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请解说下CompareTo()与Compare()详细工作原理相关的知识,希望对你有一定的参考价值。

下面是我编写参照学习资料编写的一个程序,请详细说下CompareTo()它是点样进行排序的,还有Compare()详细工作原理,已经没什么分可给了,麻烦各位可以为我解答,小弟在此谢过!

class Person:IComparable

public string Name;
public int Age;
public Person(string name, int age)

Name = name;
Age = age;

public int CompareTo(object obj)

Person otherPerson = obj as Person;
return this.Age - otherPerson.Age;



class PersonComparerName : IComparer

public static IComparer Default = new PersonComparerName();
public int Compare(object x, object y)

return Comparer.Default.Compare(((Person)x).Name, ((Person)y).Name);



class Program

static void Main(string[] args)

ArrayList list = new ArrayList();
list.Add(new Person("abc", 22));
list.Add(new Person("aad", 21));
list.Add(new Person("aba", 23));
list.Add(new Person("bcg", 27));

list.Sort();//我知道这里对list按age大小进行了排序,请解释这是点样进行的
//这里进行了list按字母进行排序,也请详细解释下,就它两工作原理我不太明白
list.Sort(PersonComparerName.Default);
for (int i = 0; i <= list.Count - 1; i++)

Console.Write("0 1 ", ((Person)list[i]).Name, (list[i] as Person).Age);

Console.ReadKey();

1.其内部排序算法你不用管,如果你真想知道,请自己google“七大排序算法”,微软内部算法也不会超过7个范围

2.有关Compare的解释是不管是使用那个排序算法,你都需要比较规则,你这里就是给的比较规则,实际你自己想一下就明白了,不管算法上怎么排序,但是我总需要给出两个物品的比较的结果“大于,小于,等于”,知道这个结果了,你哪怕用最原始的冒泡排序也可以排出来
参考技术A

    compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法,比如MapReduce中Map函数和Reduce函数处理的 <key,value>,其中需要根据key对键值对进行排序,所以,key实现了WritableComparable<T>接口,实现这个接口可同时用于序列化和反序列化。WritableComparable<T>接口(用于序列化和反序列化)是Writable接口和Comparable<T>接口的组合;

    compare(Object o1,Object o2)方法是java.util.Comparator<T>接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法。

compare()和compareTo()区别

compareTo

a.compareTo(b)将此对象与指定的对象进行比较以进行排序。

Comparable接口:比较值并返回一个int,它告诉值是否比较小于,等于或大于。

如果您的类对象具有自然顺序,请实现该Comparable<T>接口并定义此方法。所有具有自然排序实现的Java类Comparable<T>- 示例:String包装类BigInteger

 

compare

compare(a, b)比较其两个参数的顺序。

比较器接口: 比较两个对象的值。这被实现为的一部分Comparator<T>界面,并且典型的使用是定义实现此的一个或多个小工具类,传递给方法,例如sort()或使用通过排序数据结构,例如TreeMapTreeSet。您可能希望为以下内容创建Comparator对象:

 

两个标红的字段说明一个对象排序,一个是对传的参数进行排序。

 

compareTo和equal

在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法。我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于。同时我们也知道equals也可以判断两个对象是否相等。

下面的例子用age比较排序,用name比较是否相等

public class Student implements Comparable<Student> 
    private String id;
    private String name;
    private int age;

    public String getId() 
        return id;
    

    public void setId(String id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public int getAge() 
        return age;
    

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

    public Student(String id, String name, int age)
        this.id = id;
        this.name = name;
        this.age = age;
    

    @Override
    public boolean equals(Object obj)
        if(obj == null)
            return false;
        

        if(this == obj)
            return true;
        

        if(obj.getClass() != this.getClass())
            return false;
        

        Student student = (Student)obj;
        if(!student.getName().equals(getName()))
            return false;
        

        return true;
    

    @Override
    public int compareTo(Student student) 
        //升序
        return this.age - student.age;
        //降序
        //return student.age - this.age;
    


客户端主程序

    public static void main(String[] args)
        List<Student> list = new ArrayList<>();
        list.add(new Student("1", "chenssy1", 24));
        list.add(new Student("2", "chenssy1", 26));
        
        Collections.sort(list);   //排序
    

compare

事例演示

public class Teacher 
    private int age;

    public Teacher(int age) 
        this.age = age;
    

    public int getAge() 
        return age;
    

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

比较器

public class TeacherComparator implements Comparator<Teacher> 
    @Override
    public int compare(Teacher o1, Teacher o2) 
        //升序
        return o1.getAge() - o2.getAge();
        //降序
        //return o2.getAge() - o1.getAge();
    

客户端主程序

    public static void main(String[] args)
        List<Teacher> list = new ArrayList<>();
        list.add(new Teacher(18));
        list.add(new Teacher(30));
        list.add(new Teacher(22));
        list.add(new Teacher(43));
        list.add(new Teacher(21));
        Collections.sort(list, new TeacherComparator());

        System.out.println(list);
    

 

以上是关于请解说下CompareTo()与Compare()详细工作原理的主要内容,如果未能解决你的问题,请参考以下文章

C# CompareTo 和 String.Compare

Java compare方法和compareTo方法

Java 里的Comparator接口里的compare方法怎么确定升降序的?

比较器:Compare接口与Comparator接口区别与理解

Java 中 compareTo方法问题

常见的接口与类 -- Comparable