比较器

Java语言中的比较器分为两种:

Comparable比较器:Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。(作用在实体类上)同时也被称之为:内部比较器。

Comparator比较器:我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。(作用在排序类上)同时也被称之为:外部比较器。

案例 1 内部比较器:

先创建一个类:

public class House implements Comparable{

//房子的面积及总价

private int area;

private int money;

public House() {

}

public House(int area, int money) {

this.area = area;

this.money = money;

}

@Override//自定义比较规则:按照面积比大小 (负数 0 正数)

public int compareTo(House o) {

return this.getArea()-o.getArea();

}

@Override

public String toString() {

return "House{" +

"area=" + area +

", money=" + money +

'}';

}

public int getArea() {

return area;

}

public void setArea(int area) {

this.area = area;

}

public int getMoney() {

return money;

}

public void setMoney(int money) {

this.money = money;

}

}

创建测试类:

public class TestHouse {

public static void main(String[] args) {

House h1 = new House(90, 1000000);

House h2 = new House(100, 1500000);

House h3 = new House(50, 500000);

House h4 = new House(80, 2000000);

House h5 = new House(70, 1600000);

House[] houses={h1,h2,h3,h4,h5};

System.out.println("排序前!");

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

System.out.println("排序后!");

//给对象排序时,需要实体类实现 Comparable 接口,才可以实现排序

Arrays.sort(houses);

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

}

}

输出的结构为:

排序前!

[ 面积=90 价格=1000000 , 面积=100 价格=1500000 , 面积=50 价格=500000 , 面积=80 价格=2000000 , 面积=70 价格=1600000 ]

排序后!

[ 面积=50 价格=500000 , 面积=70 价格=1600000 , 面积=80 价格=2000000 , 面积=90 价格=1000000 , 面积=100 价格=1500000 ]

因此可以看出排序依据按照我们定义的规则完成!!!

案例 2 外部比较器:

先创建一个任意类来进行我们的操作:

public class Dog {

private String name;

private int age;

@Override

public String toString() {

return

"名字=" + name +

"年龄=" + age;

}

public Dog() {

}

public Dog(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

再创建一个外部比较器类继承 Comparator 接口并写 compare 方法:

public class CompareDog implements Comparator {

@Override

public int compare(Dog o1, Dog o2) {

//return o1.getAge()-o2.getAge();根据年龄排序

//把每个字符变成int类型后再进行比较

return o1.getName().compareTo(o2.getName());//根据名字排序

}

}

最后创建测试类测试:

public class TestDog {

public static void main(String[] args) {

Dog[]dogs={

new Dog("菲菲",5),

new Dog("前前",9),

new Dog("嘿嘿",1),

new Dog("蕾蕾",6),

new Dog("牛牛",4)

};

System.out.println("排序前:");

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

System.out.println("排序后:");

Arrays.sort(dogs,new CompareDog());

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

}

}

运行结果为:

排序前:

[ 名字=菲菲 年龄=5 , 名字=前前 年龄=9 , 名字=嘿嘿 年龄=1 , 名字=蕾蕾 年龄=6 , 名字=牛牛 年龄=4 ]

排序后:

[ 名字=嘿嘿 年龄=1 , 名字=牛牛 年龄=4 , 名字=菲菲 年龄=5 , 名字=蕾蕾 年龄=6 , 名字=前前 年龄=9 ]

因此可以看出排序依据按照我们定义的规则完成!!!

当然名字也可以排序,按照汉字的排序规则排序!

本文地址:https://blog.csdn.net/DSM781314056/article/details/111997739

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

java中自定义比较器_Java中的比较器:自定义规则!!!相关推荐

  1. java中同步组件_Java并发编程(自定义同步组件)

    并发包结构图: 编写一个自定义同步组件来加深对同步器的理解 业务要求: * 编写一个自定义同步组件来加深对同步器的理解. * 设计一个同步工具:该工具在同一时刻,只允许至多两个线程同时访问,超过两个线 ...

  2. java中的集合_Java中集合中的基本概念

    集合:保存多个其他对象的对象,不能保存简单类型. Collection框架的结构如下: Collection是最基本的集合接口,一个Collection代表一组object,即Collection的元 ...

  3. java 异常处理发生异常_Java中的异常处理

    java 异常处理发生异常 Exception Handling in Java is a very interesting topic. Exception is an error event th ...

  4. java中default关键字_Java 中的 default 关键字及代码示例

    本文通过代码示例介绍如何在 Java 中使用 default 关键字. 基本上,有 3 个地方可以使用 Java 中的 default 关键字: 在 switch case 语句中指定默认值 在 Ja ...

  5. java -jar 工作原理_Java 中的 jar ,天天见,可是你知道它的运行机制吗?

    本文由读者 muggle 投稿,muggle 是一位极具极客精神的 90 后单身老实猿,他的博客地址是:http://muggle.javaboy.org/ 今天介绍两个大家每天都在用但是却很少去了解 ...

  6. java变量存储位置_java 中变量存储位置的区别

    [原文] 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量 ...

  7. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  8. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  9. java 静态资源变量_Java中读取配置文件中的内容,并将其赋值给静态变量的方法...

    项目开发中某个功能需要抽取成方法写成一个工具类,提供给别人使用.写过工具类的人都知道,工具类中的方法一般都是静态方法,可以直接使用类名点方法名调用, 使用很方便,比如判断某个对象是否为空的方式Obje ...

  10. java 删除list元素_JAVA中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

最新文章

  1. LCS最长公共子序列和LIS最长上升子序列——例题剖析
  2. 在家办公的第一天,钉钉、企业微信集体“崩溃”...
  3. c++学习笔记之静态成员函数
  4. jQuery实现图片延迟加载
  5. flash写保护原理_为什么固态会掉盘?著名的30分钟大法修复是什么原理?
  6. CCIE理论-第八篇-SD-WAN(三)+DAI(动态ARP检测)
  7. 自回归AR模型、移动平均MA模型、自回归移动平均ARMA模型
  8. mysql 命令行执行存储过程_mysql 命令行执行存储过程
  9. ThreadPool执行异步操作
  10. 主从复制之操作实践(二)
  11. bilibili 韩顺平Java后端学习路线
  12. 海康威视二次开发 python_海康威视面试python后端题
  13. win7安装Android Studio
  14. jQuery手动触发事件
  15. 大型传统企业要不要提升自身的IT研发能力
  16. Linux就该这么学第十三节课学习心得
  17. 新手看Mockplus2.3
  18. python常见函数sort()对列表元素进行排序
  19. Redis从入门到深入-删除策略(18)
  20. 阿里云视频点播技术能力盘点

热门文章

  1. 支持移动端深度学习的几种开源框架
  2. Hadoop Intellij IDEA 建demo
  3. android 判断有线耳机、蓝牙耳机连接
  4. C++矩阵处理工具——Eigen
  5. java 基本类型 object_Java常用类-Object类
  6. java resultset jdbc_【JDBC系列】JDBC原生处理ResultSet
  7. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...
  8. nginx关于域名解析的源码分析
  9. linux下lua bit模块的安装
  10. linux a文本编辑大全,Linux sed 命令 - Linux文档编辑命令大全