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. C#通过WIN32 API实现嵌入程序窗体

    本文实例讲述了C#通过WIN32 API实现嵌入程序窗体的方法,分享给大家供大家参考.具体如下: 这是一个不使用COM,而是通过WIN32 API实现的示例, 它把写字板程序嵌在了自己的一个面板中. ...

  2. SQL 查询结果为 XML

    --原始数据 SELECT  OrderNO,CreateDate,Username,Address FROM   Whir_Order_OrderInfo --1.AUTO模式 SELECT  Or ...

  3. ListView局部更新(非notifyDataSetChanged)

    package com.example.test; import java.util.ArrayList; import java.util.List; import android.app.Acti ...

  4. redis命令_ZADD

    ZADD key score member [[score member] [score member] ...] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中. 如 ...

  5. matplotlib 添加注释的方式

    matplotlib 添加注释的方式 matplotlib.pyplot.annotate Annotate the point xy with text s s : str The text of ...

  6. iOS开发 -李洪强-清除缓存

    // //  SetViewController.m //  dfhx // //  Created by dfhx_iMac_001 on 16/4/5. //  Copyright © 2016年 ...

  7. 前端点击删除按钮删除table表格的数据

    table.on('tool(hostTable)', function (obj) { var data = obj.data;//须写 if (obj.event === 'del') { var ...

  8. application/x-www-form-urlencoded接口响应报文中文乱码

    1.如何处理乱码 在进行接口测试时,在用httpclient post请求时,对于Content-Type:application/json来说,在写测试脚本时只需要为头信息和post请求指定相应编码 ...

  9. Archive for required library xx cannot be read or is not a valid ZIP file

    原因:maven下载的jar包有问题,导致maven编译的时候出错 解决方法:找到jar包所在的文件路径,在网上重新下载个相同版本的jar包,问题解决

  10. iOS swift String 换行显示

    在oc中换行的方式 NSString *str = @" aaaaa \ bbbbb \ cccc \ "; swift中这种方式不可用 ,swift中换行采用新的方双三引号 &q ...