TreeSet是Set集合的常见子类.

TreeSet:底层结构是 二叉树

    元素是有排序的,但是不可以有重复元素.

相关代码演练:

/*
TreeSet ;元素是有序的,但是不可以元素重复. */ import java.util.*; class TreeSetDemo
{
public static void main(String [] args)
{
TreeSet ts = new TreeSet(); ts.add("java01");
ts.add("java03");
ts.add("java02");
ts.add("java04");
ts.add("java04"); Iterator it = ts.iterator(); while(it.hasNext())
{
sop(it.next());
} ts.remove("java02");
sop(ts); }
public static void sop(Object obj)
{
System.out.println(obj);
} } class Student
{
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;
}
}

TreeSet的两种排序方式:

第一种排序方式:(让元素自身具备比较性)让该类实现Comparable接口.并且覆写compareTo方法.这种排序是自然排序.

       保证元素唯一性的依据是: compareTo方法return 0;

代码演示:

/*
TreeSet存储自定义对象 (会抛出类型转换异常ClassCastException) Student类无法转成Comparable.
因此Student类需要实现Comparable接口.并且覆写compareTo方法.排序的方式为自然顺序. 排序时,当主要条件相同时,还要判断一下次要条件. 需求: 按学生的年龄排序.
*/ import java.util.*; class TreeSetTest
{
public static void main(String [] args)
{
TreeSet ts = new TreeSet(); ts.add(new Student("lisi08",19));
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19)); Iterator it = ts.iterator(); while(it.hasNext())
{
Student stu = (Student)it.next();
sop(stu.getName()+"------"+stu.getAge());
} }
public static void sop(Object obj)
{
System.out.println(obj);
} } class Student implements Comparable //该接口强制让学生具备了比较性. (实现了该接口需要覆盖其compareTo方法)
{
private String name;
private int age; Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{ //return 1; //怎么存的怎么取出
//return -1; //倒取存入的对象
//return 0; //只会存入第一个存入的对象. if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象"); Student s = (Student)obj; System.out.println(this.name+"---compareTo---"+s.name); if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1; } public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}

第二种排序方式:(元素不具备比较性,或者比较性是所不需要的)此时,让集合自身具备比较性.在集合一初始化时,就有比较方式.

实现方式: 定义一个类,实现comparator接口,并覆写其中的compare方法.

/*
让容器自身具备比较性,
定义一个比较器.将比较器对象传递给TreeSet集合的构造函数; 思路步骤:
定义一个容器让这个容器实现comparator,并且覆写其中的compare方法.
*/ import java.util.*; class TreeSetTest2
{
public static void main(String [] args)
{
//TreeSet ts = new TreeSet(); //传入的不是比较器对象时,调用的是CompareTo方法. TreeSet ts = new TreeSet(new MyComparator()); //将比较器传递给TreeSet的构造函数. ts.add(new Student("lisi08",19));
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi02",23));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19)); Iterator it = ts.iterator(); while(it.hasNext())
{
Student stu = (Student)it.next();
sop(stu.getName()+"-----"+stu.getAge());
} } public static void sop(Object obj)
{
System.out.println(obj);
} } 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;
} public int compareTo(Object obj) //覆写了Comparable中的compareTo方法.
{
if(!(obj instanceof Student))
throw new RuntimeException("bushixueshengduixiang"); Student s = (Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
}
} class MyComparator implements Comparator //定义一个容器并实现了Comparator接口
{
public int compare(Object o1,Object o2) //覆写其中的compare方法.
{ if(!(o1 instanceof Student ||o2 instanceof Student))
throw new RuntimeException("对象错误."); Student s1 = (Student)o1;
Student s2 = (Student)o2; //return s1.getName().compareTo(s2.getName()); //无法存储到姓名相同年龄不同的对象. int num = s1.getName().compareTo(s2.getName()); //判断返回值 (1 0 -1)
if(num==0) //判断的名字相同时,在判断其年龄是否相同.
{
return s1.getAge()-s2.getAge();
/*
if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;
*/
} return num; }
}

练习:

按照字符串的长度进行排序.

/*
练习:按照字符串长度排序 */ import java.util.*; class TreeSetExam
{
public static void main(String [] args)
{
TreeSet ts = new TreeSet(new StrLengthCompare()); ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("a");
ts.add("hahaha");
ts.add("aa"); Iterator it = ts.iterator(); while(it.hasNext())
{
sop(it.next());
} } public static void sop(Object obj)
{
System.out.println(obj);
} } class StrLengthCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
if(!(o1 instanceof String || o2 instanceof String))
throw new RuntimeException("ERROR"); String s1 = (String)o1;
String s2 = (String)o2; //int num = s1.length()-s2.length();
int num = new Integer(s1.length()).compareTo(new Integer(s2.length())); if(num==0) //判断长度一样的字符串的自然排序.
{
return s1.compareTo(s2);
}
return num;
}
}

注意:一定要记得先对主要条件进行判断,在对次要条件进行判断.避免出现漏存的情况.

集合框架-TreeSet的更多相关文章

  1. 集合框架-TreeSet集合

    1 package cn.itcast.p5.treeset.demo; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 ...

  2. java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)

    /*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返 ...

  3. 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解

    这一篇对TreeSet做介绍,先看一个简单的例子: * TreeSet:能够对元素按照某种规则进行排序.  * 排序有两种方式  * A:自然排序: 从小到大排序  * B:比较器排序    Comp ...

  4. 【Java学习笔记】<集合框架>TreeSet,Comparable,Comparator

    public class Person implements Comparable{ private String name; private int age; public Person(){ su ...

  5. 集合框架-TreeSet集合-二叉树

    1 package cn.itcast.p5.treeset.demo; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 ...

  6. 阶段01Java基础day17集合框架03

    17.01_集合框架(HashSet存储字符串并遍历) A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 HashSet<String> hs = ...

  7. day17<集合框架+>

    集合框架(HashSet存储字符串并遍历) 集合框架(HashSet存储自定义对象保证元素唯一性) 集合框架(HashSet存储自定义对象保证元素唯一性图解及代码优化) 集合框架(HashSet如何保 ...

  8. 【java集合框架源码剖析系列】java源码剖析之TreeSet

    本博客将从源码的角度带领大家学习TreeSet相关的知识. 一TreeSet类的定义: public class TreeSet<E> extends AbstractSet<E&g ...

  9. Java集合框架之TreeSet浅析

    Java集合框架之TreeSet浅析 一.TreeSet综述: 1.1TreeSet简介: TreeSet是Java集合框架的重要成员,先来看看TreeSet在jdk1.8中的定义吧: public ...

随机推荐

  1. 武道释义 &#183; 零散

    若是你防御你的左边.你的右边必定是弱点: 若是你防御你的前面,你的后面必定是弱点. 若是你处处小心防御,则必定处处都是弱点." 有些武术尽管先声夺人.但却如喝渗水之酒,令人越瞧越觉无味: 但 ...

  2. unity tips

    1.在unity 的mecanim中,如果一个动画指向两个或两个以上的动画,那么在inspector中,transitions中可以看到所有的过渡路径,这些路径是有先后顺序的.

  3. onvif规范的实现:成功实现ONVIF协议RTSP-Video-Stream与OnvifDeviceManager的视频对接

    有了前几篇的基础,现在可以正式开始onvif的实现工作,其中一项非常重要的部分就是视频流的对接,即能够在符合onvif标准的监控客户端软件里接收到设备端NVT发来的RTSP视频流.这里,我所用的客户端 ...

  4. 转:C#: static关键字的作用

    tatic意思是静态,可以修饰类.字段.属性.方法 标记为static的就不用创建实例对象调用了,可以通过类名直接点出来 static三种用法: 1.用于变量前,表示每次重新使用该变量所在方法.类或自 ...

  5. C#中equals方法和==的区别

    Msdn中对equals方法的解释是:确定指定的对象是否等于当前对象. Equals方法是比较对象的内容,而==则是比较整个对象是否相等. Equals方法判断的是堆中的值,而==则判断的是堆栈中的值 ...

  6. Spring学习之Ioc控制反转(1)

    开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...

  7. Java三大特征之封装(一)

    封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保 ...

  8. 使用mysqlbinlog工具进行基于位置或时间点的数据恢复

    使用mysqlbinlog工具进行基于位置或时间点的恢复 MySQL备份一般采取全备份加日志备份的方式,比如每天执行一次全备份,每小时执行一次二进制日志备份.这样在MySQL Server故障后可以使 ...

  9. Java路径问题最终解决方案—可定位所有资源的相对路径寻址

    1.在Java项目中,应该通过绝对路径访问文件,以下为访问的常用方法: 第一种方法:类名.class.getResource("/").getPath()+文件名 第二种方法:Th ...

  10. 开源轻量级移动端友好的JS地图库——leaflet学习教程

    Leaflet 是一个为建设交互性好适用于移动设备地图,而开发的现代的.开源的 JavaScript 库.代码仅有 33 KB,但它具有开发在线地图的大部分功能.Leaflet设计坚持简便.高性能和可 ...