java之15天 TreeSet集合 (一)

[size=medium][b]HashSet 和 TreeSet [/b][/size]

TreeSet的第一种排序 元素自身拥有比较功能 哈哈

/**
* Set 无序的,不可以重复元素
* |--HashSet: 底层数据结构是哈希表, 线程不同步
* hashSet是如何保证元素唯一性呢?
* 是通过元素的两个方法, hashCode 和 equals 来完成的
* 如果元素的hashCode值相同,才会判断equals 是否为true
* 如果元素的hashCode值不同,不会调用 equals.
*
* 注意: 对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法.
*
* |--TreeSet: 可以对Set集合中的元素进行排序
* 底层数据结构式是二叉树
* 保证元素唯一性的依据
* compareTo 方法 return 0 TreeSet 中就只会有一个 元素
*
* TreeSet排序的第一种方式,让元素自身具备比较性,
* 元素需要实现Comparable接口,覆盖compareTo 方法
* 这种方式 也成为元素的自然顺序,或者叫默认顺序.
*
* TreeSet的第二种排序方式.
* 当元素自身不具备比较性时,或者具备的比较性不是所需要的 .
* 这是就需要让集合自身具备比较性.
* 在集合初始化时,就有了比较方式.
*
*
* 需求:
* 往TreeSet集合中存储自定义对象学生
* 想按照学生的年龄进行排序.
*
* 记住:排序时,当主要条件相同时,一定要判断一下次要条件.
*
*/

public class TreeSetDemo {
public static void main(String[] args) {
method_1();
System.out.println("=======================");
method_2();
}

//保存自定义对象
public static void method_2(){
TreeSet ts=new TreeSet();
ts.add(new Student("lisi01",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",19));
ts.add(new Student("lisi01",40));
ts.add(new Student("lisi007",30));
ts.add(new Student("lisi09",36));
ts.add(new Student("lisi01",29));
ts.add(new Student("lisi01",90));

Iterator it=ts.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getName()+"...."+stu.getAge());
}

}

//保存普通对象
public static void method_1(){
TreeSet ts= new TreeSet();
ts.add("cba");
ts.add("abcd");
ts.add("aaa");
ts.add("bca");

Iterator it =ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
//使用TreeSet来保存自定义对象

class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}

public String getName(){
return name;
}

public int getAge(){
return age;
}

@Override
public int compareTo(Object obj) {
// TODO Auto-generated method stub
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student stu=(Student)obj;
if(this.age>stu.age)
return 1;
else if(this.age==stu.age){
//return 0;
//如果年龄相同的时候 就需要按照姓名排序
return this.name.compareTo(stu.name);
}
return -1;
}
}


[size=medium][b]TreeSet 的第二种比较方式(当元素自身不具备比较方法的时候)[/b][/size]

/**
* TreeSet的第二种排序方式.
*
* 当元素自身不具备比较性时,或者具备的比较性不是所需要的 .
* 这是就需要让集合自身具备比较性.
* 在集合初始化时,就有了比较方式.
* 步骤
* 1.定义比较器 (定义一个类,实现Comparator,覆盖compare方法.)
* 2.传递给 TreeSet比较器
*
* 注意:
* 当两种排序都存在时候,以比较器为主.
*
*
* 需求变了:
* 要改成 name排序 这样我们为了 不需改 Student 的原比较方法 我们定义一个比较器 采用 name进行比较
*/
public class TreeSetDemo1 {

public static void main(String[] args) {
//之前才使用 age比较
method_1();
//需求变了 要改成 name排序 这样我们为了 不需改 Student 的原比较方法 我们定义一个比较器 采用 name进行比较
System.out.println("==========================");
//改成使用 name比较
method_2();

}
public static void method_2(){
//这样就可以 实现 name比较了哦
TreeSet ts=new TreeSet(new StudentComparator());
ts.add(new Student("lisi01",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",19));


Iterator it=ts.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getName()+"...."+stu.getAge());
}
}
public static void method_1(){
TreeSet ts=new TreeSet();
ts.add(new Student("lisi01",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",19));

Iterator it=ts.iterator();
while(it.hasNext()){
Student stu=(Student)it.next();
System.out.println(stu.getName()+"...."+stu.getAge());
}
}

}

class Student implements Comparable{
private String name;
private int age;

Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}

@Override
public int compareTo(Object obj) {
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student stu=(Student)obj;
return new Integer(this.age).compareTo(new Integer(stu.getAge()));
}

}

class StudentComparator implements Comparator{

@Override
public int compare(Object o1, Object o2) {
Student t1=(Student)o1;
Student t2=(Student)o2;
int num=t1.getName().compareTo(t2.getName());
if(num==0)
return new Integer(t1.getAge()).compareTo(new Integer(t2.getAge()));
return num;
}

}



[size=medium][b]TreeSet练习[/b][/size]

/**
* 练习 :按照字符串的长度排序
* 字符串本身具备比较性,但是他的比较方式不是所需要的.
*
* 这时就只能使用比较器.
* 注意 : 主要和次要条件的比较
*/

public class TreeSetTest {

public static void main(String[] args) {
TreeSet ts=new TreeSet(new StrLenComparator());
ts.add("abcde");
ts.add("cc");
ts.add("bad"); //长度都相同 内容不同
ts.add("gdg"); //长度都相同 内容不同
ts.add("hahaha");

Iterator it=ts.iterator();

while(it.hasNext())
System.out.println(it.next());

}

}

class StrLenComparator implements Comparator{

@Override
public int compare(Object o1, Object o2) {
String s1=(String)o1;
String s2=(String)o2;

/*
if(s1.length()>s2.length())
return 1;
if(s1.length()==s2.length())
return 0;
return -1;
*/
int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));

//主要条件判断完了 判断次要条件
if(num==0)
return s1.compareTo(s2);

return num;
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值