使用TreeSet存储Integer对象

TreeSet的特点是可以对存放进去的元素进行排序。

package com.monkey1024.set;

import java.util.TreeSet;

/**
* TreeSet可以对元素进行排序
* 使用TreeSet存储Integer对象
* @author Administrator
*
*/
public class TreeSetTest01 { public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<>();
ts.add(3);
ts.add(3);
ts.add(3);
ts.add(1);
ts.add(1);
ts.add(5);
ts.add(2);
ts.add(4);
ts.add(2); System.out.println(ts);
} }

使用TreeSet存储自定义类型对象

这里还是存储之前定义的Person对象,需要实现Comparable接口并且重写compareTo方法,先根据name的字典顺序排序,然后再根据年龄进行排序。

package com.monkey1024.bean;

/**
* Person类
*
*/
public class Person implements Comparable<Person>{ private String name;
private int age; public Person() { } 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;
} // 重写toString方法
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} @Override
public int compareTo(Person o) {
int num = this.name.compareTo(o.getName());
if(num != 0){
//先用name排序
return num;
}else{
//如果姓名排序一样则以age进行排序
return this.age - o.getAge();
}
} }

测试类:

package com.monkey1024.set;

import java.util.TreeSet;

import com.monkey1024.bean.Person;

/**
* TreeSet可以对元素进行排序
* 使用TreeSet存储Person对象
*
*/
public class TreeSetTest02 { public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person("tony", 23));
ts.add(new Person("paul", 20));
ts.add(new Person("andy", 22));
ts.add(new Person("james", 24));
ts.add(new Person("lucy", 21)); System.out.println(ts);
} }

测试类里面如果name写的是中文的话则不能进行汉语拼音排序,因为String类中重写的compareTo方法是根据char类型对应的ascii值进行排序的。

compareTo方法的返回值

TreeSet使用了二叉树的数据结构,负数放到左边,正数放到右边。

当compareTo方法返回0的时候,系统会认为两者一致,所以不会向集合中添加元素

当compareTo方法返回正数的时候,系统将元素存储到右边,所以集合存取顺序一致

compare返回正数

当compareTo方法返回负数的时候,系统将元素存储到左边,所以集合会倒序存储

compare返回负数

Comparator比较器

可以向TreeSet的构造方法中传入一个定制的Comparator,如果传入了Comparator的子类对象, 那么TreeSet就会按照传入对象中定制的规则排序。例如将Person中name按照长度排序。

定制一个CompareByNameLength类实现Comparator接口并重写compare方法,在方法里面编写排序规则

package com.monkey1024.set;

import java.util.Comparator;

import com.monkey1024.bean.Person;

public class CompareByNameLength implements Comparator<Person> {

    @Override
public int compare(Person p1, Person p2) {
//根据name长度进行排序
int num = p1.getName().length() - p2.getName().length();
if(num == 0){
num = p1.getName().compareTo(p2.getName());
if(num == 0){
num = p1.getAge() - p2.getAge();
}
}
return num;
} }

测试类,向TreeSet的构造方法中传入CompareByNameLength对象

package com.monkey1024.set;

import java.util.TreeSet;

import com.monkey1024.bean.Person;

/**
* TreeSet可以对元素进行排序
* 使用TreeSet根据name长度进行排序
*
*/
public class TreeSetTest03 { public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>(new CompareByNameLength());
ts.add(new Person("tony", 23));
ts.add(new Person("jordan", 20));
ts.add(new Person("tim", 22));
ts.add(new Person("james", 24));
ts.add(new Person("an", 21)); System.out.println(ts);
} }

练习

1.将一个字符串中的字符按照字典顺序进行排序,要保留重复的字符。例如输入:java,打印aajv

答案

1.向输入的字符串转换为字符数组,然后向TreeSet中添加字符

package com.monkey1024.set.exercise;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet; /**
* 问题:将一个字符串中的字符按照字典顺序进行排序,要保留重复的字符。例如输入:java,打印aajv
* 分析:向输入的字符串转换为字符数组,然后向TreeSet中添加字符
*/
public class Exercise03 { public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入一行字符串:");
String line = sc.nextLine(); //将键盘录入的字符串存储在line中
char[] arr = line.toCharArray(); //将字符串转换成字符数组
TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() { @Override
public int compare(Character c1, Character c2) {
int num = c1.compareTo(c2);
//保存重复数据
return num == 0 ? 1 : num;
}
}); for(char c : arr) {
ts.add(c);
} for(Character ch : ts) {
System.out.print(ch);
}
} }

1-27TreeSet简介的更多相关文章

  1. ASP.NET Core 1.1 简介

    ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...

  2. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  3. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  4. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  5. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

  6. const,static,extern 简介

    const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...

  7. HTTPS简介

    一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...

  8. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  9. Cesium简介以及离线部署运行

    Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...

  10. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

随机推荐

  1. 往android的内核添加驱动及 ueventd.rc 修改【转】

    本文转载自:http://blog.csdn.net/lkqboy2599/article/details/8350100 向android的内核添加驱动,其实就是向linux内核添加驱动.主要在两个 ...

  2. Java GET和POST请求

    从表面来看GET和POST请求: GET请求是在url后直接附上请求体,url和请求体之间用"?"分割,不同参数之间用"&"分隔,%XX中的XX为该符号 ...

  3. .net2.0 C# Json反序列化

    http://cjl20082002.blog.163.com/blog/static/120827332009511103457637/ 去:http://json.codeplex.com/下载  ...

  4. SQL server 备份/恢复/压缩 进度查询

    第一步,用 sp_who2 查出备份的sid(或在窗口中的连接属性中看) exec sp_who2 第二步,用以下查询获得运行情况(看 percent_complete列) SELECT sessio ...

  5. linux文件查找(find,locate)

    文件查找: locate:       非实时,模糊匹配,查找是根据全系统文件数据库进行的: # updatedb, 手动生成文件数据库 速度快   find:       实时       精确   ...

  6. LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal

    原题链接在这里:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/ 题 ...

  7. Js常见的六种报错

    EvalError: raised when an error occurs executing code in eval() EvalError:当一个错误发生在()执行的代码RangeError: ...

  8. HttpClient入门教程

    HttpClient使用详解与实战一:https://www.jianshu.com/p/375be5929bed

  9. mysql分区表之四:分区表性能

    一,      分区概念  分区允许根据指定的规则,跨文件系统分配单个表的多个部分.表的不同部分在不同的位置被存储为单独的表.MySQL从5.1.3开始支持Partition. 分区和手动分表对比 手 ...

  10. Indexed DB入门导学(1) – 51CTO.COM

    在html 5中,其中一个引人注意的新特性,那就是允许使用Indexed DB.… 查阅全文 ›