java自带的数据类型 为什么可以自动排序呢

java利用自定义类型对树形数据类型进行排序
前言
为什么集合在存自定义类型时需要重写equals和hashCode?

1、先说List集合
List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了!

因为我们通常判断一个对象是否在集合中存在只需要判断值就行 而List内部实现方法是用地址来进行判断的 因为我们在创建对象时即使是值都一样

但是内存地址不一样 所以也就无法判定 一个对象是否在另一个对象中存在 我们可以在自定义类中重写equals方法 只是值相等就证明该对象在集合中存在

2、在说Set集合
Set集合在存自定义类型的数据时 为了要保证唯一性(set集合的特点:数据是不能重复的)我们要重写hashCode(执行效率高) 和 equals 内部就会自动判断

如果数据相等就不添加否则就添加到集合中

不管是利用Set集合的TreeSet 还是用Map集合的TreeMap 这二个数据类型的共同点都是 只存知道怎么排序的集合这是为什么,如果我们要想存自定义类型的数据该怎么办?

是因为上面二个集合在add的时候内部调用了基本数据类型的compareTo方法(内部排序是先比较后排序) 这些数据类型(例如String、Double)内部都已经重写了compareTo方法 所以可以自动排序

而我们在上面二个集合中添加自定义类型的数据时 会报错编译不通过(因为树形数据类型 是不存不知道怎么排序的集合的) 就是因为 自定义类型不知道按什么排序 是添加不到上面集合中去的 这个时候我们也需要重写compareTo 按我们自定义类型中的某个字段排序就可以了。

重写compareTo是第一种方法 下面来看下核心代码及视图:

public static void main(String[] args) {
// 利用自定义类型 为树形集合数据类型排序

// 1、java自带的数据类型 为什么可以自动排序呢?
// 因为add方法里调用了 compareTo java自带的数据类型都重写了 compareTo方法
// 2、自定义类型怎么实现自动排序?
// 根据1中的推理 我们也需要再自定义类中重写 compareTo方法 已到达按哪个字段排序的目的
// 因为树形数据类型 是不存不知道怎么排序的集合的

// 返回值为0:已存在
// 返回值为正:放到后
// 返回值为负:放到前

    TreeSet<Student> tss = new TreeSet<Student>();

    tss.add(new Student("b",9));
    tss.add(new Student("f",8));
    tss.add(new Student("a",20));
    tss.add(new Student("c",19));
    tss.add(new Student("b",18));
    tss.add(new Student("b",18));
    System.out.println(tss);
     
}

public int compareTo(Student o) {
// TODO Auto-generated method stub
int res = this.age - o.age;

// 假如年龄相等按照名称排序
if(res == 0){
String name1 = this.name;
String name2 = o.name;
return name1.compareTo(name2);
}else{
return res;
}
}

在这里插入图片描述
1、图中的compareTo为什么有参数? 比较需要二个对象进行比较 一个是之前的数据 this 一个是通过参数传进来的对象 也就是传统的A类调用B类

2、第二种:可以利用多态 将比较方法提取出来放到一个类中 然后将此类对象作为TreeSet的 成员属性 通过TreeSet的构造方法为成员属性赋值 如下图:

在这里插入图片描述

第二种方法的灵活性比较高可以按多种选择进行排序。实例代码:

//比较器类
public class Comp1 implements Comparator {

@Override
public int compare(Book o1, Book o2) {
    // TODO Auto-generated method stub

// 先按编号排序在按书名排序
int res = o1.getNum() - o2.getNum();

    if(res == 0){
        String name1 = o1.getName();
        String name2 = o2.getName();
        return name1.compareTo(name2);
    }else{
        return res;
    }
}

}

TreeSet ts = new TreeSet(new Comp1());
ts.add(new Book(“葵花宝典”, 2));
ts.add(new Book(“九阴真经”,1));
System.out.println(ts);

总结:正负决定排序规则
树形结构如何保证数据唯一性?

1、HashSet和LinkedHashSet 我们自定义类需要重写hashCode和equals方法

2、TreeSet 自定义类时需要重写compareTo方法

3、TreeSet 自定义类时可以创建比较器类

集合排序总结:
1、List集合 可以自己写排序 (冒泡或者选择)

2、Set集合

 1)hashSet和LinkedHashSet   无法排序

2)TreeSet 自然排序 和自定义类型排序(可以利用compareTo和编写比较器来进行排序)【目的只是为了能够存自定义类型的数据】

3、Map集合同Set集合一样

4、Collections工具类中一些方法的操作只针对List集合(不针对没有下标的集合)

大家喜欢的干货来了:
1.Java中自带了两种排序方法, 一种是 Collections.sort(), 另一种是 Arrays.sort()
2.无论是collections.sort()还是Arrays.sort()底层都是TimSort实现的(jdk1.7新增的,1.7以前的归并排序);
TimSort排序是先找到已经排序好的子排序,再去排序其他部分,最后合并起来。
源码调用流程:
感兴趣的朋友跟一下源码就会发现: Collections.sort()调用–>list.sort() 调用–>ArrayList的Arrays.sort()调用–>TimSort.sort方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值