1.java中Comparor与Comparable的问题
1.Comparator中compare()与Comparable中compareTo()方法的区别
Treeset集合创建对象后,
A:如果是空构造,即TreeSet<Student> ts = new TreeSet<Student>(); ,那么ts.add();,时需要在Student上implements Comparable<Student>接口,在下面重写compareTo()方法,因为此时的add()调用的是compareTo()方法,底层以红黑二叉树,判断之后,排序
B:如果是带参构造,即TreeSet<Student> ts = new TreeSet<Student>(Comparator<? super E>comparator); ,ts.add()时,需要自己写个MyComparator类implements Comparator<Student>接口,(如果调用的较少的话,可以在创建对象的时候,以内部类的形式重写方法)或者在在MyComparator中重写compare()方法.
C:未解决的问题:为什么把
int num = s1.getName().length() - s2.getName().length();
(二叉树,左中右顺序)
s1与s2换个位置之后,就会倒着排序了,二叉树里,不是大的放在右边吗?
而且换个位置之后根节点还是第一个数吗?如果是的话,那么判断的时候
数是像哪样呢?
import java.util.Comparator;
import java.util.TreeSet; /*
* 需求:按照姓名的长度排序
*
* public TreeSet(Comparator<? super E> comparator):构造一个新的空 TreeSet,它根据指定比较器进行排序。
*/
public class TreeSetDemo {
public static void main(String[] args) {
// 创建集合对象
// TreeSet<Student> ts = new TreeSet<Student>();
// 比较器排序
// TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
// 内部类的形式
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// 按照姓名的长度排序
int num = s1.getName().length() - s2.getName().length();
// 当姓名的长度相同时,判断姓名是否相等
int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
: num;
// 当姓名相同时,判断年龄是否相等
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
}
});
// 创建学生对象
Student s1 = new Student("小fsd名", 12);
Student s2 = new Student("小sdf白", 22);
Student s3 = new Student("小sf黑", 33);
Student s4 = new Student("小菜", 13);
Student s5 = new Student("小黑", 33);
Student s6 = new Student("小sdfsdfc", 13);
Student s7 = new Student("小dsfsd黑黑", 33);
Student s8 = new Student("小sfsd菜", 122);
Student s9 = new Student("小黑", 33);
Student s10 = new Student("小c", 13); // 添加元素
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
ts.add(s7);
ts.add(s8);
ts.add(s9);
ts.add(s10); // 遍历元素
for (Student s : ts) {
System.out.println(s);
}
}
}
import java.util.Comparator; public class MyComparator implements Comparator<Student> { @Override
public int compare(Student s1, Student s2) {
// 按照姓名的长度排序
int num = s1.getName().length() - s2.getName().length();
// 当姓名的长度相同时,判断姓名是否相等
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
// 当姓名相同时,判断年龄是否相等
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
} }
//或者public class Student implements Comparable
public class Student {
// 姓名
private String name;
// 年龄
private int age; public Student() {
super();
} public Student(String name, int age) {
super();
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;
} @Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
} // @Override
// public int compareTo(Student s) {
// // 按照姓名的长度排序
// int num = this.name.length() - s.name.length();
// // 当姓名的长度相同时,判断姓名是否相等
// int num2 = num == 0 ? this.getName().compareTo(s.getName()) : num;
// // 当姓名相同时,判断年龄是否相等
// int num3 = num2 == 0 ? this.getAge() - this.getAge() : num2;
// return num3;
// }
}
1.java中Comparor与Comparable的问题的更多相关文章
- java中Comparatable接口和Comparator接口的区别
1.不同类型的排序规则 .自然排序是什么? 自然排序是一种升序排序.对于不同的数据类型,升序规则不一样: BigDecimal BigInteger Byte Double Float Int ...
- Java中的集合(六)继承Collection的Set接口
Java中的集合(六)继承Collection的Set接口 一.Set接口的简介 Set接口和List接口都是继承自Collection接口,它与Collection接口中功能基本一致,并没有对Col ...
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- java 中的2个接口 Comparable和Comparator
像Integer.String这些类型的数据都是已经实现Comparable接口的,所以对这些类型可以直接通过Arrays.sort(...)和Collections.sort(...)方法进行排序. ...
- 如何理解 Java 中的 <T extends Comparable<? super T>>
Java 中类似 <T extends Comparable<? super T>> 这样的类型参数 (Type Parameter) 在 JDK 中或工具类方法中经常能看到. ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
- Java中的Comparable<T>和Comparator<T>接口
有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别). 1) 在使用普通数组的时候,如果想对数据进行排序 ...
随机推荐
- 轻量集群管理工具PSSH
PSSH 的意思是 Parallel SSH,并行的SSH,很好理解,PSSH 可以让一条命令在多个服务器上同时执行 这就简化了集群的管理工作,例如想查看一下各台服务器现在的负载状况,就可以通过 PS ...
- php-fig组织psr标准
psr规范 基本代码规范,本篇规范制定了代码基本元素的相关标准,以确保共享的PHP代码间具有较高程度的技术互通性. 关键词 “必须”(MUST). “一定不可.一定不能”(MUST NOT). “需要 ...
- PsExec使用
01. 创建一个 Process Process.FileName ="文件路径及文件名称" Process.Arguments ="\\PC PI地址 -u 用户名 - ...
- 打败 IE 的葵花宝典:CSS Bug Table
博主说:本博客文章来源包括转载,翻译,原创,且在文章内均有标明.鼓励原创,支持创作共享,请勿用于商业用途,转载请注明文章链接.本文链接:http://www.kein.pw/?p=35 原文发表于:A ...
- 关于UI功能解锁,UI特效动画,UI tips的再思考
之前写过一篇这样的文章,但当时的思路可行性太低 首先所有的UI面板通过发送字符串消息来告知,是否触发了解锁检测,tips检测,动画特效.可以理解为这样的接口: AsyncResult SendUIMe ...
- [docker]docker run指定entrypiont
指定entrypiont 错误的姿势 docker run -itd -v /tmp/:/tmp/ jdk-ori 'java -jar /tmp/sms.jar' 正确的姿势1 docker run ...
- Unable to verify your data submission错误解决
如果不用Yii2提供的ActiveForm组件生成表单,而是自定义表单,那么当你提交表单的时候就会报这个错误 Unable to verify your data submission 这是因为Web ...
- jsp的页面包含——静态包含、动态包含
一.静态包含:包含的文件可以是jsp文件.html文件.文本文件或者一段java代码.<%@ include file="要包含的文件路径"%> 实质是先将所包含的文件 ...
- html 基本标签 ---字体
<b> </b>加粗 <i> </i> 斜体 <del> </del> 删除 <ins> </ins> ...
- log4j2配合slf4j使用
说明 log4j2被用于日志输出,相信绝大多数程序猿都对此不陌生.笔者刚接触log4j2,因此记个博客备用. log4j2是一个日志框架,slf4j是日志框架接口,之所以使用log4j2和slf4j搭 ...