java对象排序(Comparable)详细实例,java comparable 多属性排序

  java对象排序(Comparable)详细实例,java comparable 多属性排序

  00-1010 1.不同的字面意思。不同用法2.1可比较的2.2可比较的排序方法2.3比较器3。扩展:比较器匿名类4。用来概括两者比较结构图:的不同场景

  在Java语言中,Comparable和Comparator都是用来对元素进行排序的,但本质上是不同的。也是常见的面试问题,今天就一起设置吧。

  00-1010我们先从两者的字面意思来理解。Comparative翻译成中文就是“比较”的意思,Comparator就是“比较者”。Compare以-able结尾,表示具有某种能力,Comparator以-or结尾,表示是比较的参与者。这是从字面意思来理解两者的区别。

  00-1010都是顶级接口,但是方法和用法不同。我们分开来看。

  

目录

Comparable接口只有一个方法compareTo。通过实现Comparable接口并重写compareTo方法,可以对类进行排序。它支持Collections.sort和Arrays.sort排序

 

  在我们没有使用 Comparable 时,程序的执行是这样的:

  进口龙目岛。吸气剂;进口龙目岛。二传手;进口龙目岛。ToString导入Java . util . ArrayList;导入Java . util . list;类可比示例{ public static void main(string[]args){//创建对象Person p1=new Person(1,18, Java );Person p2=新人(2,22, MySQL );Person p3=新人(3,6, Redis );//添加到set list person list=new ArrayList();list . add(P1);list . add(p2);list . add(P3);//打印集合信息list . foreach(p-system . out . println(p . getname(): p . getage()));} }//下面的set/get/toString都使用lombok @ getter @ setter @ toString class person { private int id;私人年龄;私有字符串名称;public Person(int id,int age,String name){ this . id=id;this.age=年龄;this.name=name} }程序执行结果如下:

  从上图可以看出,当自定义类Person不实现Comparable时,列表集不排序,只能以元素的插入顺序作为输出顺序。

  然而这个时候,老板有一个需求:需要按照人对象的年龄属性逆序排序,即按照年龄属性从大到小排序。这时候我们可以把你请出来,我们的主角,可比,就出来了。

  使用compare是为了在自定义对象的类中实现compare接口,并重写compareTo方法以实现自定义排序规则具体实现代码如下:.

  进口龙目岛。吸气剂;进口龙目岛。二传手;进口龙目岛。ToString导入Java . util . ArrayList;导入Java . util . collections;导入Java . util . list;普布利

  c class ComparableExample { public static void main(String[] args) { // 创建对象 Person p1 = new Person(1, 18, "Java"); Person p2 = new Person(2, 22, "MySQL"); Person p3 = new Person(3, 6, "Redis"); // 添加对象到集合 List<Person> list = new ArrayList<>(); list.add(p1); list.add(p2); list.add(p3); // 进行排序操作(根据 Person 类中 compareTo 中定义的排序规则) Collections.sort(list); // 输出集合中的顺序 list.forEach(p -> System.out.println(p.getName() + ":" + p.getAge())); }}// 以下 set/get/toString 都使用的是 lombok 提供的注解实现的@Getter@Setter@ToStringstatic class Person implements Comparable<Person> { private int id; private int age; private String name; public Person(int id, int age, String name) { this.id = id; this.age = age; this.name = name; } @Override public int compareTo(Person p) { return p.getAge() - this.getAge(); }}程序的执行结果如下图所示:

  

 

  

 

  

2.2 compareTo 排序方法说明

compareTo 方法接收的参数 p 是要对比的对象,排序规则是用当前对象和要对比的对象进行比较,然后返回一个 int 类型的值。正序从小到大的排序规则是:使用当前的对象值减去要对比对象的值;而倒序从大到小的排序规则刚好相反:是用对比对象的值减去当前对象的值。

 

  注意事项:如果自定义对象没有实现 Comparable 接口,那么它是不能使用 Collections.sort 方法进行排序的,编译器会提示如下错误:

  

 

  

 

  

2.3 Comparator

Comparator 和 Comparable 的排序方法是不同的,Comparable 排序的方法是 compareTo,而 Comparator 排序的方法是 compare,具体实现代码如下:

 

  

import lombok.Getter;import lombok.Setter;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class ComparatorExample { public static void main(String[] args) { // 创建对象 Person p1 = new Person(1, 18, "Java"); Person p2 = new Person(2, 22, "MySQL"); Person p3 = new Person(3, 6, "Redis"); // 添加对象到集合 List<Person> list = new ArrayList<>(); list.add(p1); list.add(p2); list.add(p3); // 进行排序操作(根据 PersonComparator 中定义的排序规则) Collections.sort(list, new PersonComparator()); // 输出集合中的顺序 list.forEach(p -> System.out.println(p.getName() + ":" + p.getAge())); }}/** * 用于 Person 类的比较器 */class PersonComparator implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { return p2.getAge() - p1.getAge(); }}@Getter@Setterclass Person { private int id; private int age; private String name; public Person(int id, int age, String name) { this.id = id; this.age = age; }}

程序的执行结果如下图所示:

 

  

 

  

 

  

3.扩展:Comparator 匿名类

Comparator 除了可以通过创建自定义比较器外,还可以通过匿名类的方式,更快速、便捷的完成自定义比较器的功能,

 

  具体的代码实现如下:

  

import lombok.Getter;import lombok.Setter;import java.util.ArrayList;import java.util.Comparator;import java.util.List;public class ComparatorExample { public static void main(String[] args) { // 构建并添加数据 List<Person> list = new ArrayList<>(); list.add(new Person(1, 18, "Java")); list.add(new Person(2, 20, "MySQL")); list.add(new Person(3, 6, "Redis")); // 使用 Comparator 匿名类的方式进行排序 list.sort(new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return p2.getAge() - p1.getAge(); } }); // 打印集合数据 list.forEach(p -> System.out.println(p.getName() + ":" + p.getAge())); }}@Getter@Setterstatic class Person { private int id; private int age; private String name; public Person(int id, int age, String name) { this.id = id; this.age = age; this.name = name; }}

程序的执行结果如下图所示:

 

  

 

  

 

  

4.使用的场景不同

通过上面示例的实现代码我们可以看出,使用 Comparable 必须要修改原有的类,也就是你要排序那个类,就要在那个中实现 Comparable 接口并重写 compareTo 方法,所以 Comparable 更像是对内进行排序的接口。

 

  而 Comparator 的使用则不相同,Comparator 无需修改原有类。也就是在最极端情况下,即使 Person 类是第三方提供的,我们依然可以通过创建新的自定义比较器 Comparator,来实现对第三方类 Person 的排序功能。也就是说通过 Comparator 接口可以实现和原有类的解耦,在不修改原有类的情况下实现排序功能,所以 Comparator 可以看作是对外提供排序的接口。

  

 

  

总结

Comparable 和 Comparator 都是用来实现元素排序的,它们二者的区别如下:

 

  Comparable 是比较的意思,而 Comparator 是比较器的意思;Comparable 是通过重写 compareTo 方法实现排序的,而 Comparator 是通过重写 compare 方法实现排序的;Comparable 必须由自定义类内部实现排序方法,而 Comparator 是外部定义并实现排序的。所以用一句话总结二者的区别:Comparable 可以看作是对内进行排序接口,而 Comparator 是对外进行排序的接口。

  到此这篇关于Java元素排序Comparable与Comparator的区别的文章就介绍到这了,更多相关 Comparable与Comparator 内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: