时间:2021-05-20
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
A comparison function, which imposes a total ordering on some collection of objects. Comparators can be passed to a sort method (such as Collections.sort or Arrays.sort) to allow precise control over the sort order. Comparators can also be used to control the order of certain data structures (such as sorted sets or sorted maps), or to provide an ordering for collections of objects that don't have a natural ordering. ------API
对字符串List可以直接sort进行排序, 那是因为String 这个对象已经帮我们实现了 Comparable接口 , 所以我们的 Person 如果想排序, 也要实现一个比较器。
一. Comparator
对Linkedlist存储的对象进行排序
import java.util.Comparator;import java.util.LinkedList;class Person{ private float height; private String name; Person(float height) { this.height=height; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } public String getName() { return name; } public void setName(String name) { this.name = name; }}class PersonHeight implements Comparator<Person>{ @Override //重写compare方法,return<0不变,return>0则交换顺序(保持升序) public int compare(Person e1, Person e2) { if(e1.getHeight() < e2.getHeight()){ return 1; } else { return -1; } }}public class Question3 { public static void main(String[] args) { Person p1=new Person(23.4f); p1.setName("Stud1"); Person p2=new Person(2.34f); p2.setName("Stud2"); Person p3=new Person(34.32f); p3.setName("Stud3"); Person p4=new Person(56.45f); p4.setName("Stud4"); Person p5=new Person(21.4f); p5.setName("Stud5"); LinkedList<Person> al=new LinkedList<Person>(); al.add(p1); al.add(p2); al.add(p3); al.add(p4); al.add(p5); //调用sort方法,实现排序 Collections.sort(al, new PersonHeight()); //遍历输出 for(Person p:al) System.out.println(p.getName()); }}
附加:
二. Comparable
import java.util.Collections;import java.util.Comparator;import java.util.LinkedList;class Person implements Comparable{ private float height; private String name; Person(float height) { this.height=height; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Object o) { // TODO Auto-generated method stub if(this.height>((Person)o).height){ return 1; }else return -1; } }public class Question3 { public static void main(String[] args) { Person p1=new Person(23.4f); p1.setName("Stud1"); Person p2=new Person(2.34f); p2.setName("Stud2"); Person p3=new Person(34.32f); p3.setName("Stud3"); Person p4=new Person(56.45f); p4.setName("Stud4"); Person p5=new Person(21.4f); p5.setName("Stud5"); LinkedList<Person> al=new LinkedList<Person>(); al.add(p1); al.add(p2); al.add(p3); al.add(p4); al.add(p5); Collections.sort(al); for(Person p:al) System.out.println(p.getName()); }}三.比较
Comparable 定义在Person类的内部。
Comparator 是定义在Person的外部的, 此时我们的Person类的结构不需要有任何变化。
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java的比较器有两类,分别是Comparable接口和Comparator接口。在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接
JavaComparable和Comparator的详解及区别Java中为我们提供了两种比较机制:Comparable和Comparator,他们之间有什么区别
详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比
在前面一篇JavaComparable和Comparator对比详解中,对于java中的排序方法进行比较和具体剖析,主要是针对Comparator接口和Comp
这篇文章主要介绍了Java比较接口comparable与comparator区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值