首页 > 编程语言 >JAVA中的Comparable接口和自定义比较器

JAVA中的Comparable接口和自定义比较器

时间:2023-02-15 12:03:27浏览次数:48  
标签:Comparable JAVA name 自定义 age String TreeSet Teacher treeSet


Java中的自然排序
自然排序
定制排序
自然排序
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}]
1
定制排序
如果单单使用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]


标签:Comparable,JAVA,name,自定义,age,String,TreeSet,Teacher,treeSet
From: https://blog.51cto.com/u_14389461/6059082

相关文章

  • Java NIO:Buffer、Channel 和 Selector详解
    本来要一起介绍非阻塞IO和JDK7的异步IO的,不过因为之前的文章真的太长了,有点影响读者阅读,所以这里将它们放到另一篇文章中进行介绍。Buffer一个Buffer本质上是内存......
  • 重学Java-第六章 Java运算符
    6.1算术运算符​ Java语言提供了执行加减乘除四则运算的运算符。算数运算符被用在数学表达式中,可以使用任意嵌套的小括号,其作用与数学中相同。下表列出了算术运算符:......
  • 重学Java-第二章 Java快速入门
    2.1在Windows上安装Java2.1.1下载安装包打开Oracle官网的JDK下载地址,推荐下载JDK1.8版本,1.8版本是目前企业使用最多的版本,下拉找到Java8,选择windows平台。​ ......
  • 重学Java-第三章 Java基本语法
    3.1基本语法​ 编写Java程序时,应注意以下几点:大小写敏感:Java是对大小写敏感的,这就表示标识符Hello和hello是不同的。类名:对所有的类来说,类名的首字母应大写,若类名由......
  • 重学Java-第四章 Java变量
    4.1什么是变量​ 在程序设计中,变量是指一个包含值的存储地址以及对应的符号名称。从定义上来看,变量大概可以分为两部分:变量的名字和变量的值,可通过变量来访问变量值。......
  • 重学Java-第五章 Java数据类型
    5.1概述​ Java语言的数据类型可以分为基本数据类型(primitivedatatype)和引用型数据类型(referencedatatype)5.2基本数据类型5.2.1整数类型​ Java语言提供了......
  • java 字符串如何直接转LocalDateTime?
    1.情景展示在实际开发过程中,可能会遇到将前端传的日期格式转成LocalDateTime插入到数据库的情况,如何将日期转成LocalDateTime呢?2.原因分析在Java8中,日期类不同于以......
  • java 文件File与byte[]数组相互转换的两种方式
     1.文件转byte[]方式一:文件输入流Filefile=newFile("C:\\Users\\Marydon\\Desktop\\个人信用报告.pdf");try{FileInputStreamfis=newFileInputStream(file);......
  • JavaScript 中 ?. 和 ?? 分别是什么?
    ?.和??是JavaScript中的两个新操作符,分别是可选链操作符(optionalchainingoperator)和空值合并操作符(nullishcoalescingoperator)。?.操作符?.可选链操作符用于......
  • java json对象转json字符串(带转义符)(json对象嵌套json字符串)
    1.情景展示如上图所示,这一个标准的json字符串,双引号需要使用反斜杠\进行转义,一般情况下,我们是用不到这种json字符串的,在java中,json字符串的通常表现形式是这种:......