当需要排序的集合或数组不是单纯的数字型时,通常可以使用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()); } }
附加:
//对日期进行排序 /** * 如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0; */ @Override public int compare(Step o1, Step o2) { Date acceptTime1=UtilTool.strToDate(o1.getAcceptTime(), null); Date acceptTime2=UtilTool.strToDate(o2.getAcceptTime(), null); //对日期字段进行升序,如果欲降序可采用before方法 if(acceptTime1.after(acceptTime2)) return 1; return -1; }
二. 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 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
本文向大家介绍对比Java中的Comparable排序接口和Comparator比较器接口,包括了对比Java中的Comparable排序接口和Comparator比较器接口的使用技巧和注意事项,需要的朋友参考一下 Comparable Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在
问题内容: 我头疼,调试困难。我正在尝试比较两个通用值,以便可以根据值将它们插入到数组中进行排序。这是我第一次使用Comparable和Comparator界面,因此围绕这些问题的任何其他建议都是不错的选择。 这是我的班级设置方式: put()方法: 这些是我要实现的compareTo()和compare方法。 我遇到的第一个问题是compareTo()方法中的问题,它以“ this”为中心。该错
本文向大家介绍Java中Comparable和Comparator之间的区别,包括了Java中Comparable和Comparator之间的区别的使用技巧和注意事项,需要的朋友参考一下 比较器和比较器都是可用于对集合元素进行排序的接口。比较器接口属于java.util包,而可比较的接口属于java.lang包。比较器接口使用提供给它的两个对象进行排序收集,而可比较接口比较“this”是指提供给它
本文向大家介绍Java Comparable 和 Comparator 的详解及区别,包括了Java Comparable 和 Comparator 的详解及区别的使用技巧和注意事项,需要的朋友参考一下 Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下。
本文向大家介绍Java Comparator比较器实例解析,包括了Java Comparator比较器实例解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java Comparator比较器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 说几点需要注意的,提醒自己即可: 以下是单独定义一个比较器的类,实现了Comparat
我试图实现Comparable和compareTo(),但似乎无法实现。我一直在尝试不同的方法,但我真的不明白。我知道我应该实现可比较的接口,并且我需要在使用它之前创建方法(对我来说很奇怪,从python到面向对象编程)。 我希望它能比较两个人的年龄,所以我试着编写如下所示的代码,但似乎我不能使用compareTo()。我收到错误消息:“此方法必须返回int类型”,但在我看来,我只返回1、-1和0
我面临一个java泛型的问题,我的计划是实现一个二叉查找树(key 中的if语句不被接受,我认为这是因为我重写了comareTo,但是我应该如何比较泛型? 还尝试了而不是,结果相同。 最好的问候 编辑:编译器说:在这一行的多个标记-比较类型中的方法comareTo(捕获#1-of?)不适用于参数(可比)-行断点: KeyValPair[line: 39]-comareTo(KeyValPair)
我有一个使用对象标识的令牌类(如只返回)。我想在中使用它。这意味着我需要实现与引用相等兼容的两个令牌之间的比较。我不关心具体的实现,只要它与一致并履行契约(根据:"注意,如果要正确实现Set接口,由set维护的顺序(无论是否提供显式比较器)必须与equals一致。") 注意:这些令牌是在多个线程上创建的,可以在不同的线程上进行比较。 这样做的最佳方法是什么? 我尝试过的想法: 使用——问题在于,不