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) 在使用普通数组的时候,如果想对数据进行排序 ...
随机推荐
- mysql-group-replication 测试环境的搭建与排错
mysql-group-replication 是由mysql-5.7.17这个版本提供的强一致的高可用集群解决方案 1.环境规划 主机ip 主机名 172.16.192.201 balm001 17 ...
- Exif.js获取图片的详细信息(苹果手机移动端上传图片旋转90度)
Exif.js插件介绍 http://code.ciaoca.com/javascript/exif-js/ iOS手机竖着拍的照片经过前端处理之后被旋转了90°的原因以及解决方案 https://w ...
- Atitit.java的浏览器插件技术 Applet japplet attilax总结
Atitit.java的浏览器插件技术 Applet japplet attilax总结 1. Applet类及各个方法说明 1 2. JApplet类示例 2 3. / 用main方法运行JAp ...
- NSArray、NSMutableArray和NSMutableDictionary的用法
转自:http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt=1 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域 ...
- 真正理解红黑树,真正的(Linux内核里大量用到的数据结构,且常被二货问到)
作为一种数据结构.红黑树可谓不算朴素.由于各种宣传让它过于神奇,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话.它最坏情况怎么怎么地... ...
- csu-1328 近似回文词 和 最长回文字符串
原博文地址:http://blog.csdn.net/u012773338/article/details/39857997 最长回文子串 描述:输入一个字符串,求出其中最长的回文子串.子串的含义是: ...
- Apache服务器 403 Forbidden的几种错误原因小结!
403 Forbidden错误原因详解 403 - Forbidden(禁止访问),服务器拒绝请求 - forbidden request (matches a deny filter) => ...
- [转]Linux(Ubuntu)下如何安装JDK
转自:http://www.cnblogs.com/savagemorgan/p/3650926.html 注:这篇博客里面有两个问题 1.解压的时候不用sudo,mv的时候不用sudo,我的安装路径 ...
- SessionListener失败,退出
配置如下: web.xml: <listener> <listener-class>cn.edu.hbcf.common.listener.SessionListener< ...
- JavaScript绘图类 (DIV绘图)
主要的图形算法抄自一个叫w_jsGraphics.js的类库,第一次看到那个库的时候,感觉那是十分神奇的存在.不过估计现在那个库早就已经找不到了. 这是很早之前的一个DIV绘图类,那时候VML+SVG ...
