JAVA中Comparable接口和自定义比较器示例讲解

自然排序

TreeSet集合在存储数据时有一定的顺序,它会将一些数据进行比较,比较调用的是comparaTo()方法,该方法是在Comparable中定义的,自然排序要求TreeSet集合中存储的数据必须实现Comparable接口,并且重写ComparaTo()方法

public class 自然排序 {
 public static void main(String[] args) {
 //定义一个TreeSet集合
 TreeSet treeSet = new TreeSet();
 Teacher t1 = new Teacher("Jack",19);
 Teacher t2 = new Teacher("King",20);
 Teacher t3 = new Teacher("Tom",19);
 Teacher t4 = new Teacher("Rose",20);
 treeSet.add(t1);
 treeSet.add(t2);
 treeSet.add(t3);
 treeSet.add(t4);
 System.out.println(treeSet);
 }
}
//定义Teacher类实现Comparable接口
class Teacher implements Comparable{

 String name;
 int age;
 public Teacher(String name,int age){
 this.name = name;
 this.age = age;
 }
 //重写toString方法
 @Override
 public String toString() {
 return "Teacher{" +
  "name='" + name + '\'' +
  ", age=" + age +
  '}';
 }
 //先比较年龄在比较名字
 @Override
 public int compareTo(Object o) {
 Teacher teacher = (Teacher)o;
 if (this.age > teacher.age){
  return 1;
 }
 if (this.age == teacher.age){
  return this.name.compareTo(teacher.name);
 }
 return -1;
 }
}

运行结果

[Teacher{name='Jack', age=19}, Teacher{name='Tom', age=19}, Teacher{name='King', age=20}, Teacher{name='Rose', age=20}]

定制排序

如果单单使用ComparaTo()不能满足要求,这时可以通过在创建TreeSet集合的时候就自定义一个比较器来对元素进行定制排序

import java.util.Comparator;
import java.util.TreeSet;

public class 定制排序 {
 public static void main(String[] args) {
 //在创建集合是传入比较器
 TreeSet treeSet = new TreeSet(new MyComparable());
 treeSet.add("Jack");
 treeSet.add("Tom");
 treeSet.add("Helena");
 System.out.println(treeSet);
 }
}
//自定义的比较器
class MyComparable implements Comparator{

 @Override
 public int compare(Object o1, Object o2) {
 //以单词的长度来排序
 String s1 = (String)o1;
 String s2 = (String)o2;
 int resoult = s1.length() - s2.length();
 return resoult;
 }
}

结果

[Tom, Jack, Helena]

总结

到此这篇关于JAVA中Comparable接口和自定义比较器的文章就介绍到这了,更多相关JAVA中Comparable接口和自定义比较器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java Comparable及Comparator接口区别详解

    在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系. 一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接口和Comparator接口.首先类要实现接口,并且使用泛型规定要进行比较的对象所属的类,然后类实现了接口后,还需

  • 对比Java中的Comparable排序接口和Comparator比较器接口

    Comparable Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序". 即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序. 此外,"实现Comparable接口的类的对象"可以用作"有序映射(如Tree

  • java中实现Comparable接口实现自定义排序的示例

    实例如下所示: class Student implements Comparable{ String name; int gpa; @Override public int compareTo(Object arg0) { // TODO Auto-generated method stub Student s = (Student)arg0; if(gpa == s.gpa) return name.compareTo(s.name); else if(gpa < s.gpa) return

  • 浅析Java中comparator接口与Comparable接口的区别

    Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(或数组)",则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序. 此外,"实现Comparable接口的类的对象"可以用作"有序映射(如

  • java比较器Comparable接口与Comaprator接口的深入分析

    java的比较器有两类,分别是Comparable接口和Comparator接口.在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口.让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下: 复制代码 代码如下: class Student implements Comparable<Student>{    priv

  • Java 比较接口comparable与comparator区别解析

    这篇文章主要介绍了Java 比较接口comparable与comparator区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package test0; import java.util.Comparator; //限定修饰符为friend不能为public,一个java文件中只能有一个public类 /*** * java程序是从一个public类的main函数开始执行的, *(其实是main线程),就像c程序是从main()函数开

  • 详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧. Comparable 简介 Comparable 是排序接口. 若一个类实现了Comparable接口,就意味着"该类支持排序".  即然实现Comparable接口的类支持排序,假设现在存在"实现Comparable接口的类的对象的List列表(

  • java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 package com.practice.test.comparable; import java.util.Date; /** * 描述:要比较的对象 * * @author cui * @create 2018-12-18 14:07 */ public class MySortBean implemen

  • JAVA中Comparable接口和自定义比较器示例讲解

    自然排序 TreeSet集合在存储数据时有一定的顺序,它会将一些数据进行比较,比较调用的是comparaTo()方法,该方法是在Comparable中定义的,自然排序要求TreeSet集合中存储的数据必须实现Comparable接口,并且重写ComparaTo()方法 public class 自然排序 { public static void main(String[] args) { //定义一个TreeSet集合 TreeSet treeSet = new TreeSet(); Teach

  • 浅谈Java中几种常见的比较器的实现方法

    在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用"=="来完成. 第二个方面:以对象的某一个属性的角度去比较. 从最新的JDK8而言,有三种实现对象比较的方法: 一.覆写Object类的equals()方法: 二.继承Comparable接口,并实现compareTo()方法: 三.定义一个单独的对象比较器,继承自Comparator接口

  • java 中Comparable与Comparator详解与比较

    java 中Comparable与Comparator详解 今天查看TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparator接口分别进行处理.那么疑问就来了,Comparable和Comparator接口的区别是什么,Java中为什么会存在两个类似的接口?   Comparable和Comparator接口都是用来比较大小的,首先来看一下Comparable的定义

  • java中set接口使用方法详解

    java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为: 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的.集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序.但就集合本身的特性而言,元素之间没有必然的序. 空集的性质:空集是一切集合的子集 S

  • Java中LinkedList详解和使用示例_动力节点Java学院整理

    第1部分 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表.它也可以被当作堆栈.队列或双端队列进行操作. LinkedList 实现 List 接口,能对它进行队列操作. LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用. LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆. LinkedList 实现java.io.Serial

  • Java中joda日期格式化工具的使用示例

    1.基本介绍 Java自带日期格式化工具DateFormat ,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中.如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果.因此,从日期.时间处理的所有实践来说,我强力推荐使用joda-time 库. 2.joda-time的使用 引入依赖 <de

  • 详解Java中Collector接口的组成

    一.Collector常常出现的地方 java8引入了stream,Collector是与stream一起出现的,配合stream使用的好帮手,如果用过stream,我们应该都有写过这样的代码 例子1: lists.stream()....collect(Collectors.toList()); 例子2: lists.stream().collect(groupingBy(String::length)); 这两个例子中,toList()和groupingBy()返回的都是一个Collecto

随机推荐