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的问题的更多相关文章

  1. java中Comparatable接口和Comparator接口的区别

    1.不同类型的排序规则 .自然排序是什么?   自然排序是一种升序排序.对于不同的数据类型,升序规则不一样:   BigDecimal BigInteger Byte Double Float Int ...

  2. Java中的集合(六)继承Collection的Set接口

    Java中的集合(六)继承Collection的Set接口 一.Set接口的简介 Set接口和List接口都是继承自Collection接口,它与Collection接口中功能基本一致,并没有对Col ...

  3. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  4. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  5. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  6. java 中的2个接口 Comparable和Comparator

    像Integer.String这些类型的数据都是已经实现Comparable接口的,所以对这些类型可以直接通过Arrays.sort(...)和Collections.sort(...)方法进行排序. ...

  7. 如何理解 Java 中的 <T extends Comparable<? super T>>

    Java 中类似 <T extends Comparable<? super T>> 这样的类型参数 (Type Parameter) 在 JDK 中或工具类方法中经常能看到. ...

  8. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

  9. Java中的Comparable<T>和Comparator<T>接口

    有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别). 1) 在使用普通数组的时候,如果想对数据进行排序 ...

随机推荐

  1. mysql操作索引的sql语句

    创建索引 一:唯一索引alter table table_name add unique index_name(column_list); 例如:alter table users_game_task ...

  2. Atitit.执行cli cmd的原理与调试

    Atitit.执行cli cmd的原理与调试 1. /c  与/k1 2. /k  参数,有利于调试1 3. -------code2 4. 打开程序后与openner脱离关系3 5. 返回参数 St ...

  3. 探索Popupwindow-对话框风格的窗体(

    Android中还是会经经常使用到Popupwindow.一种类似于对话框风格的窗体,当然类似于对话框风格也能够用Activity,能够參考:Android中使用Dialog风格弹出框的Activit ...

  4. ZOJ 3703 Happy Programming Contest(0-1背包)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3703 Happy Programming Contest Time Lim ...

  5. ORACLE的显式游标与隐式游标

    1)查询返回单行记录时→隐式游标: 2)查询返回多行记录并逐行进行处理时→显式游标 显式游标例子: DECLARE CURSOR CUR_EMP IS SELECT * FROM EMP; ROW_E ...

  6. 线上定位GC内存泄露问题

    原因:Java中存在内存泄露,就是因为对象无用却可达. 举个例子: 在这个例子中,我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector仍然引 ...

  7. 编写可维护的JavaScript----笔记(三)

    1.块语句花括号的使用 在JavaScript中,注入if和for语句有两种写法,使用花括号包裹的多行代码或者不使用花括号的单行代码.但强烈建议不论是单行还是多行代码,都应该使用花括号. 2.花括号的 ...

  8. 【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错

    当输入git命令github项目时报错: ⇒ git clone git@github.com:/TX-Class.git Cloning into 'TX-Class'... Warning: Pe ...

  9. jquery datagrid设置pageSize不起作用

    http://www.2cto.com/kf/201212/178098.html —————————————————————————————————————————————————————————— ...

  10. edmx-新建表