博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象大小对比之Comparable与Comparator
阅读量:7120 次
发布时间:2019-06-28

本文共 3929 字,大约阅读时间需要 13 分钟。

一 概述

1.Comparable与Comparator使用背景

数值型数据(byte int short long float double)天生可对比大小,可排序,String实现了Comparable接口也可以对比大小与排序,而自定义类多种多样,没有一个共有的可以用作排序的指标,因此需要在自定义类中手动建立对比的方法,出于这个目的,java提供了两个接口Comparable与Comparator。

2.集合排序

Collections.sort()底层排序依靠的是Arrays.sort(),而Arrays.sort()排序时采用的是冒泡法。

二 Comparable

需要对比大小的对象可以实现Comparable接口,实现其中的抽象方法,该抽象方法用来设定比较的方式。下面以一个示例进行说明:

1.实体类

package com.javase.collections.comparable;public class Student implements Comparable
{ private String name; private int score; public Student() { super(); } public Student(String name, int score) { super(); this.name = name; this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public int compareTo(Student stu) { return this.score - stu.score;// 操作对象减去参数对象,升序排列,反之降序。 }}

在compareTo()方法中,以属性score为排序指标,采用“this.score-stu.score”,最终结果以升序排列,反之降序。

2.测试类

package com.javase.collections.comparable;import java.util.ArrayList;import java.util.Collections;import java.util.List;import org.junit.Test;public class ComparableTest {    @Test    public void testComparable() {        List
stus = new ArrayList
(); Student zhangsan = new Student("zhangsan", 100); Student lisi = new Student("lisi", 90); Student wanger = new Student("wanger", 95); stus.add(zhangsan); stus.add(lisi); stus.add(wanger); System.out.println("排序前"); for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } System.out.println("排序后"); Collections.sort(stus); for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } }}

输出:

三 Comparator

如果一个类在创建时未实现Comparable接口,希望在不修改源码的情况下对其对象进行排序,可以在调用排序方法时实现Comparator比较器接口,指定排序方法。下面以一个示例进行说明:

1.实体类

package com.javase.collections.comparator;public class Student {    private String name;    private int score;    public Student() {        super();    }    public Student(String name, int score) {        super();        this.name = name;        this.score = score;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getScore() {        return score;    }    public void setScore(int score) {        this.score = score;    }}

2.测试类

package com.javase.collections.comparator;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import org.junit.Test;public class ComparatorTest {    @Test    public void test() {        List
stus = new ArrayList
(); Student zhangsan = new Student("zhangsan", 100); Student lisi = new Student("lisi", 90); Student wanger = new Student("wanger", 95); stus.add(zhangsan); stus.add(lisi); stus.add(wanger); System.out.println("排序前"); for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } System.out.println("-----------------------"); Collections.sort(stus, new Comparator
() { @Override public int compare(Student stu01, Student stu02) { // return stu01.getScore() - stu02.getScore();//升序 return stu02.getScore() - stu01.getScore();// 降序 } }); System.out.println("排序后"); for (Student x : stus) { System.out.println(x.getName() + "::" + x.getScore()); } }}

在compare(Student stu01, Student stu02)方法中,以属性score为排序指标,采用“stu01.score-stu02.score”,最终结果升序排列,反之降序。

输出:

 

参考:

转载于:https://www.cnblogs.com/tonghun/p/7148234.html

你可能感兴趣的文章
android之Handler详解
查看>>
小积累,大收获
查看>>
JS、CSS合并带来的效率提升
查看>>
Json 语法 格式
查看>>
面试思考,入职初期怎么做
查看>>
php---需要判断远程URL是否有效
查看>>
我的友情链接
查看>>
java中使用switch case报错case expressions must be constant expressions
查看>>
Android开发网
查看>>
关于加域后win7、win8的C:\不能够新建文件,报0X0070522错误的解决方式
查看>>
安卓反编译揭秘,伪加密APK文件如何被破坏
查看>>
Advanced Bash Sell Scripting学习笔记1
查看>>
转:10+年程序员总结的20+条经验教训
查看>>
linux基础命令学习之mv(7)
查看>>
我的友情链接
查看>>
nagios的实时监控
查看>>
firewalld
查看>>
Vue按需加载提升用户体验
查看>>
MySQL--字符编码和字符集
查看>>
mvn命令
查看>>