德庆网站建设公司,洛阳seo博客,网络舆情的三种分类标准,调用wordpress搜索代码在Java中经常会涉及到对象数组的排序问题#xff0c;那么就涉及到对象之间的比较问题。Java实现对象排序的方式有两种#xff1a; 自然排序#xff1a;java.lang.Comparable定制排序#xff1a;java.util.Comparator 规则#xff1a;需要我们自定义根据对象的某个或某些属…在Java中经常会涉及到对象数组的排序问题那么就涉及到对象之间的比较问题。Java实现对象排序的方式有两种 自然排序java.lang.Comparable定制排序java.util.Comparator 规则需要我们自定义根据对象的某个或某些属性进行排序
1. 方式一实现Comparable接口
步骤
用我们自定义的类A实现Comparable接口重写Comparable接口中的compareTo(Object obj)方法在此方法中声明类A的对象的大小比较规则
重写compareTo(Object obj)方法示例和重写equals()方法思路类似 Overridepublic int compareTo(Object o) {//1.若实参对象和当前对象地址相同则时同一个对象if (o this) {return 0;}//2.若实参对象是当属于当前类或子类实例则强转声明比较规则if (o instanceof A) {// 强转A p (A)o;// 比较规则用参2与参1比较。小于return 负数大于return 整数相等return 0。// 比较规则1这里注意是谁的compare方法int value Double.compare(this.xxx,xxx);// 比较规则2if (value ! 0) {// 从小到大// return value;// 从大到小return -value;}// 若比较规则1的结果相同则使用该规则从从小到大return this.xxx.compareTo(p.xxx);// 从大到小// return -this.xxx.compareTo(p.xxx);}//3.若实参对象不属于当前类则抛出类型异常throw new RuntimeException(类型不匹配);// 使用示例// Arrays.sort(arr实现类对象的实例)}2. 方式二实现Comparator接口
2.1 为什么有了Comparable还需要Comparator
情况1 当我们需要对对象进行排序而对象所在类又没有实现Comparable我们也没法修改所在类代码的情况下使用。情况2 当这个类实现了Comparable接口但是比较规则不满足我们的需求而我们又无法修改其源码的时候使用。
因为以上两种情况的存在我们可以临时的去指定排序方式于是就有了Comparator。
2.2 实现
步骤
在当前类A实现Comparator接口重写compare(Object o1, Object o2)方法在此方法中声明对象的大小比较规则
注意 Comparator的比较规则会覆盖Comparable的比较规则
//1.创建一个实现Comparator接口的实现类对象这里使用了匿名实现类
Comparator comparator new Comparator() {Overridepublic int compare(Object o1, Object o2) {//2.若实参对象是当属于当前类或子类实例则强转声明比较规则if(o1 instanceof A o2 instanceof A){// 强转A p1 (A) o1;A p2 (A) o2;// 比较规则用参2与参1比较。小于return 负数大于return 整数相等return 0。// 从小到大return Double.compareTo(p1.getXxx(),p2.getXxx());// 从大到小//return -Double.compareTo(p1.getXxx(),p2.getXxx());}//3.若实参对象不属于当前类则抛出类型异常throw new RuntimeException(类型不匹配);// 使用示例// Arrays.sort(arr,comparator类A的实例);}
}3. Comparable VS Comparator
角度一
自然排序单一唯一一旦指定了比较规则就不能更改定制排序灵活多样创建多个Comparator对象指定不同的比较规则调用不同的对象即可
角度二
自然排序一劳永逸一旦声明好就可以永久使用定制排序在使用的时候才去零时声明
角度三
自然排序实现接口Comparable重写抽象方法compareTo(Object obj)定制排序实现接口Comparator重写抽象方法compare(Object o1, Object o2)