动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

实现对象排序两种方式

07-23 15:17 186浏览
举报 T字号
  • 大字
  • 中字
  • 小字

在实际开发过程中,我们难免碰见涉及到对对象按某一属性进行比较排序的问题,比如超市里面的商品按照价格排序,或者是学生按照成绩进行排名等,那么就涉及到对象之间的比较排序问题。 Java实现对象排序方式有两种:自然排序:java.lang.Comparable

定制排序:java.util.Comparator

一、自然排序:java.lang.Comparable

        Comparable接口会强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序。例如String类、包装类都实现了Comparable接口重写了CompareTo()方法,而且默认都是从小到大排列的。

        如果我们要对对象进行排序,则需要实现Comparable类,而实现 Comparable类就必须实现 compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj)方法的返回值来比较大小。如果当前对象this大于形参对象obj,则返回正整数;如果当前对象this小于形参对象obj,则返回负整数;如果当前对象this等于形参对象obj,则返回零。实现了Comparable接口的对象集合或数组可以通过Collections.sort()或Arrays.sort()进行排序。

//实现Compareable接口,重写compareTo()方法

public class Good implements Comparable{

    public String name;

    public double price;

 

    public Good() {

    }

 

    public Good(String name, double price) {

        this.name = name;

        this.price = price;

    }

 

    @Override

    public String toString() {

        return "Good{" +

                "name='" + name + '\'' +

                ", price=" + price +

                '}';

    }

 

//重写compareTo方法

    @Override

    public int compareTo(Good good) {

        if (this.price>good.price){

            return 1;

        }else if(this.price

            return -1;

        }else{

            return 0;

        }

    }

}

 

public class CompareTest {

    public static void main(String[] args) {

        Good[] goods =new Good[4];

        goods[0]=new Good("huaweiPhone",5000);

        goods[1]=new Good("vivoPhone",4000);

        goods[2]=new Good("oppoPhone",3000);

        goods[3]=new Good("xiaomiPhone",2000);

        Arrays.sort(goods);

        System.out.println(Arrays.toString(goods));

    }

}

运行结果:

二、定制排序:java.util.Comparator

        当对象的类型没有实现Comparable接口而又不方便修改代码,或者实现了Comparable接口,但排序规则不适合当前的操作的情况,可以考虑使用Comparator强行对多个对象进行整体排序。

        当我们实现Comparator接口重写compare(Object o1,Object o2)方法比较o1和o2的大小时,如果方法返回正整数,则表示o1大于o2;如果返回负整数,表示o1小于o2;如果返回0,表示相等。实现了Comparator接口的对象集合或数组可以通过Collections.sort()或Arrays.sort()进行排序。

 

public class Grade {

    public String name;

    public int score;

 

    public Grade(String name, int score) {

        this.name = name;

        this.score = score;

    }

 

    @Override

    public String toString() {

        return "Grade{" +

                "name='" + name + '\'' +

                ", score=" + score +

                '}';

    }

}

 

public class GradeComparator implements Comparator {

 

    @Override

    public int compare(Grade grade1, Grade grade2) {

        if(grade1.score>grade2.score){

            return 1;

        }else if(grade1.score

            return -1;

        }else{

            return 0;

        }

    }

}

 

public class CompareTest {

    public static void main(String[] args) {

        Grade[] grades=new Grade[4];

        grades[0]=new Grade("Tom",72);

        grades[1]=new Grade("Marry",66);

        grades[2]=new Grade("Jack",86);

        grades[3]=new Grade("Luck",56);

 

        Arrays.sort(grades,new GradeComparator());

        System.out.println(Arrays.toString(grades));

    }

}

运行结果如下所示:

综合上面的例子我们得出结论:

(1)使用Comparable进行排序时,需要对象本身实现Comparable接口并重写compareTo()方法,耦合性较高;而使用Comparator进行排序时,可以在外部实现Comparator接口重写compare()方法,耦合性较低;

(2)如果实现类没有实现Comparable接口,又想对两个类进行比较或者实现类实现了Comparable接口,但是对compareTo方法内的比较算法不满意,那么就可以实现Comparator接口,自定义一个比较器,写比较算法;

(3)Comparable和一个具体类绑定在一起,使用比较固定;而Comparator使用比较灵活,可以被用于各个需要比较功能的类;

(4)如果一个类需要进行多种比较排序,只能使用Comparator,而不能使用Comparable。

对象的排序问题一直是java中的重点知识,这其中不仅仅涉及到了算法和逻辑,还有对数据的处理能力。通过本文,我们了解了实现对象排序的两种方式及其适用条件。想要了解更多的实例和java中的排序问题,可以观看本站的java视频课程,让你离知识更进一步!

0人推荐
共同学习,写下你的评论
0条评论
进击的女程序猿
程序员进击的女程序猿

5篇文章贡献36700字

作者相关文章更多>

推荐相关文章更多>

DOM渲染的详细过程

QCode09-04 14:38

CSS水平和垂直居中技巧大梳理

Code大师09-04 14:50

mui的input框在IOS系统下无法聚焦或点击多次才能聚焦

不写代码你养我啊08-23 11:14

推荐的-视.频播放器以及在线客服

不写代码你养我啊09-17 18:02

谈谈java多线程的三大特性

要学习了06-18 18:13

发评论

举报

0/150

取消