使用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. 自动化测试框架selenium+java+TestNG——配置篇

    最近来总结下自动化测试 selenium的一些常用框架测试搭配,由简入繁,最简单的就是selenium+java+TestNG了,因为我用的是java,就只是总结下java了. TestNG在线安装: ...

  2. static静态数据的初始化

    package com.demo.book; public class StaticInitialization { static Table table = new Table(); static ...

  3. 解决Spring MVC中文乱码

    在web.xml中设置编码过滤器 <filter> <filter-name>characterEncodingFilter</filter-name> <f ...

  4. 【EOJ Monthly 2018.2 (Good bye 2017)】

    23333333333333333 由于情人节要回家,所以就先只放代码了. 此题是与我胖虎过不去. [E. 出老千的 xjj] #include<cstdio> #include<c ...

  5. SSH框架中hibernate 出现 user is not mapped 问题

    SSH框架中hibernate 出现 user is not mapped 问题      在做SSH框架整合时,在进行DAO操作时.这里就只调用了chekUser()方法.运行时报  user is ...

  6. Django (2006, 'MySQL server has gone away') 本地重现与解决

    最近我们的Django项目供Java Sofa应用进行tr调用时, 经常会出现一个异常: django.db.utils.OperationalError: (2006, 'MySQL server ...

  7. Building Objective-C static libraries with categories(ObjC、all_load、force_load)

    https://developer.apple.com/library/mac/qa/qa1490/_index.html    之所以使用该标志,和Objective-C的一个重要特性:类别(cat ...

  8. redis sentinel(哨兵)配置解读

    1 port <sentinel-port> :哨兵实例运行所在的端口(默认26379) 2 sentinel announce-ip:哨兵将会在gossip hello消息中使用指定的i ...

  9. hibernate的优缺点和适用场合

    Hibernate优点: 1.对象化.人员以面相对象的思想来操作数据库.Hibernate支持许多面向对象的特性,如组合,继承,多态等. 2.更好的移植性.对于不同的数据库,开发者只需要使用相同的数据 ...

  10. linux命令:rsync

    Rsync的命令格式可以为以下六种: rsync [OPTION]... SRC DEST rsync [OPTION]... SRC [USER@]HOST:DEST rsync [OPTION]. ...