集合中的TreeSet是集合体系结构中的底层实现,是Collection的孙子,Set的儿子。TreeSet除拥有父接口的特点外,还有其自身的特点。下面就看看TreeSet的排序是怎么实现的。从它的构造方法看,提供了无参和带参两种。
  常用到的两个构造:
  无参构造  public TreeSet()
    构造一个新的空set,该set根据其元素的自然顺序进行排序。插入该set的所有元素都必须实现Comparable接口。
  带参构造  public TreeSet(Comparator<? super E> comparator)
    构造一个新的空TreeSet,它根据指定比较器进行排序。
  API文档里面已经描述的很清楚,要实现排序,要么实现Comparable接口,要么指定比较器Comparator。接下来就分别用两种方式来实现这个过程。
  描述一个Person类。拥有成员:name、age、有参、无参构造、getters、setters。

package cn.dolphin;

public class Person {
private String name;
private int age;
public Person() {super();}
public Person(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;
}
}

第一种方式:
  使用有参构造,传递Comparator比较器。而Comparator是接口,所以没有对象,这时传递的就是实现了Comparator接口的子类的对象,而如果这个对象只用到一次又可以写成匿名内部类,于是就有了下面的代码。

package cn.dolphin;

import java.util.Comparator;
import java.util.TreeSet; public class TreeSetDemo {
public static void main(String[] args) {
// 创建TreeSet对象,用来存储Person类型对象。
TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int num1 = o1.getName().length() - o2.getName().length();
int num2 = num1 == 0 ? o1.getName().compareTo(o2.getName()) : num1;
int num3 = num2 == 0 ? o1.getAge() - o2.getAge() : num2;
return num3;
}
});
// 创建Person对象并添加到ts集合。
ts.add(new Person("aidengbao", 30));
ts.add(new Person("bosideng", 21));
ts.add(new Person("yichun", 18));
ts.add(new Person("yichun", 18));
for (Person s : ts) {
System.out.println(s.getName() + ":" + s.getAge());
}
}
}

当然也可不写成匿名内部类,只是这样就必须得定义一个类来实现Comparator接口,于是用下面的代码:

package cn.dolphin;

import java.util.Comparator;

public class ComparatorImplements implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
//主要条件,按照Person的姓名长度排序,如不相同,则添加到集合。
int num1 = o1.getName().length() - o2.getName().length();
//如果姓名长度一样,再比较姓名是否相同。如不相同,则添加到集合。
int num2 = num1 == 0 ? o1.getName().compareTo(o2.getName()) : num1;
//如果姓名也相同,再比较年龄是不是相同,如果相同,则不添加到集合,保证数据的唯一。
int num3 = num2 == 0 ? o1.getAge() - o2.getAge() : num2;
return num3;
}
}

这样,有了ComparatorImplements类实现Comparator接口后,就可以用多态的方式创建ComparatorImplements的对象传递给TreeSet。接着看代码:

package cn.dolphin;

import java.util.Comparator;
import java.util.TreeSet; public class TreeSetDemo {
public static void main(String[] args) {
// 创建TreeSet对象,用来存储Person类型对象。
Comparator<Person> ci = new ComparatorImplements();
TreeSet<Person> ts = new TreeSet<>(ci);
// 创建Person对象并添加到ts集合。
ts.add(new Person("aidengbao", 30));
ts.add(new Person("bosideng", 21));
ts.add(new Person("yichun", 18));
ts.add(new Person("yichun", 18));
for (Person s : ts) {
System.out.println(s.getName() + ":" + s.getAge());
}
}
}

通过上面的代码,明显看到使用匿名内部类的好处就是简单方便,接下来,再看看用无参构造的实现。
第二种方式:
  使用无参构造,Person类自己实现Comparable接口。

package cn.dolphin;

public class Person implements Comparable<Person>{
private String name;
private int age;
public Person() {super();}
public Person(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 int compareTo(Person o) {
int num1 = this.name.length() - o.name.length();
int num2 = num1 == 0 ? this.name.compareTo(o.name) : num1;
int num3 = num2 == 0 ? this.age - o.age : num2;
return num3;
}
}

好像看起来这样要好一点点,因为在这里可以直接使用name和age成员变量,而上面只能过过getName()和getAge()来获取,因为定义的成员在开发中可能都是私有的。Person类实现了Comparable接口,就可以使用无参的构造来对对象进行唯一性判断和对集合排序。

package cn.dolphin;

import java.util.TreeSet;

public class TreeSetDemo {
public static void main(String[] args) {
// 创建TreeSet对象,用来存储Person类型对象。
TreeSet<Person> ts = new TreeSet<>();
// 创建Person对象并添加到ts集合。
ts.add(new Person("aidengbao", 30));
ts.add(new Person("bosideng", 21));
ts.add(new Person("yichun", 18));
ts.add(new Person("yichun", 18));
for (Person s : ts) {
System.out.println(s.getName() + ":" + s.getAge());
}
}
}

虽然写了这么长,但是TreeSet并不是多么重要,用到并不多,所以也就当个了解内容吧,不过多知道点儿总归不是坏事儿。

集合TreeSet的使用的更多相关文章

  1. Java——(四)Collection之Set集合TreeSet类

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- TreeSet类 TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗 ...

  2. Java集合--TreeSet详细解析

    目录 1.构造函数 2.增 3.删 4.比较器 总结 谈到TreeSet的特点,估计大家脑海里想到的都是:有序,不可重复,红黑树,基于Treemap实现,自定义排序等特点.这篇博客帮助大家从源码梳理下 ...

  3. Java集合--TreeSet

    转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311268 第1部分 TreeSet介绍 TreeS ...

  4. 什么是泛型?,Set集合,TreeSet集合自然排序和比较器排序,数据结构-二叉树,数据结构-平衡二叉树

    ==知识点== 1.泛型 2.Set集合 3.TreeSet 4.数据结构-二叉树 5.数据结构-平衡二叉树 ==用到的单词== 1.element[ˈelɪmənt] 要素 元素(软) 2.key[ ...

  5. TreeSet集合

    TreeSet集合 TreeSet集合是一个依靠TreeMap实现的有序集合,内部存储元素是自动按照自然排序进行排列,所以如果想要保留存储时的顺序,那么就不建议使用TreeSet. TreeSet继承 ...

  6. TreeSet集合解析

    TreeSet是实现Set接口的实现类.所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理.所以要理解这个类,必须先简单理解一下什么是二叉树. 二叉树原理简析 假如有这么一个集 ...

  7. java基础33 Set集合下的HashSet集合和TreeSet集合

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  8. 详解java中的TreeSet集合

    TreeSet是实现Set接口的实现类.所以它存储的值是唯一的,同时也可以对存储的值进行排序,排序用的是二叉树原理.所以要理解这个类,必须先简单理解一下什么是二叉树. 二叉树原理简述 假如有这么一个集 ...

  9. Java集合框架之TreeSet

    简述 TreeSet是基于TreeMap作为存储的可排序.可去重的有序集合 继承于AbstractSet,AbstractSet实现了equals和hashcode方法 实现了NavigableSet ...

随机推荐

  1. linux 命令 xxd

    xxd,能够查看linux下文件的二进制表示.man一下xxd.能够得到下面信息 NAME        xxd - make a hexdump or do the reverse. SYNOPSI ...

  2. Testbench的编写

    Testbench的作用,在于给我们编写的可综合代码的模块送入激励.即在我们波形仿真中用编写testbench来代替拖拽波形.其中还包括了我们硬件仿真与matlab仿真的联调建立(将matlab产生的 ...

  3. event内存泄漏

    C#内存泄漏--event内存泄漏 内存泄漏是指:当一块内存被分配后,被丢弃,没有任何实例指针指向这块内存, 并且这块内存不会被GC视为垃圾进行回收.这块内存会一直存在,直到程序退出.C#是托管型代码 ...

  4. base标签的作用是什么

    转自:https://www.cnblogs.com/chenqiBlog/p/9517905.html base标签是HTML语言中的基准网址标记,它是一个单标签,位于网页头部文件的head标签内, ...

  5. Linux就该这么学 20181005(第八章防火墙)

    参考链接https://www.linuxprobe.com/ vim /etc/sysconfig/network-scripts/ifcfg-ens32 网络配置0 nmtui 网络配置1 nm- ...

  6. CentOS7系统安装完MySQL后启动MySQL提示无服务

    重新安装MariaDB数据库即可解决,MySQL所有命令可通用 MariaDB MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,开发这个分支的原因之一是:甲骨文公司收购了My ...

  7. 移动端video播放时不弹出页面层

    移动端视频在播放时会主动弹出页面,有的浏览器不会.对那些会的浏览器进行处理: 直接加上下面三个属性即可,兼容方面就不说了,微信上是很ok的. <video x5-playsinline=&quo ...

  8. 【原创】使用Kettle的一些心得和经验

    用kettle做etl也有段时间了,遇到很多问题,总结了一下. [关于版本的问题] kettle常用的版本有4.1和4.4,对于4.1版本: 1.该版本的兼容性有点差,在某些机器上运行会启动失败,或者 ...

  9. Linux部署之批量自动安装系统之DHCP篇

    1.         安装:yum install dhcp   2.         Ip配置信息   3.         Dhcp配置文件如下   4.         配置完后检查语法是否错误 ...

  10. ZBrush中功能强大的插件PaintStop

    PaintStop是ZBrush®3.1的手绘插件,可以比较真实的模拟手绘风格,尤其是用水彩笔刷画水墨风格画.PaintStop插件可供用户免费使用. PaintStop是一款功能强大的插件,已经被添 ...