使用TreeSet存储Integer对象

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

  1. package com.monkey1024.set;
  2. import java.util.TreeSet;
  3. /**
  4. * TreeSet可以对元素进行排序
  5. * 使用TreeSet存储Integer对象
  6. * @author Administrator
  7. *
  8. */
  9. public class TreeSetTest01 {
  10. public static void main(String[] args) {
  11. TreeSet<Integer> ts = new TreeSet<>();
  12. ts.add(3);
  13. ts.add(3);
  14. ts.add(3);
  15. ts.add(1);
  16. ts.add(1);
  17. ts.add(5);
  18. ts.add(2);
  19. ts.add(4);
  20. ts.add(2);
  21. System.out.println(ts);
  22. }
  23. }

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

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

  1. package com.monkey1024.bean;
  2. /**
  3. * Person类
  4. *
  5. */
  6. public class Person implements Comparable<Person>{
  7. private String name;
  8. private int age;
  9. public Person() {
  10. }
  11. public Person(String name, int age) {
  12. super();
  13. this.name = name;
  14. this.age = age;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public int getAge() {
  23. return age;
  24. }
  25. public void setAge(int age) {
  26. this.age = age;
  27. }
  28. // 重写toString方法
  29. @Override
  30. public String toString() {
  31. return "Person [name=" + name + ", age=" + age + "]";
  32. }
  33. @Override
  34. public int hashCode() {
  35. final int prime = 31;
  36. int result = 1;
  37. result = prime * result + age;
  38. result = prime * result + ((name == null) ? 0 : name.hashCode());
  39. return result;
  40. }
  41. @Override
  42. public boolean equals(Object obj) {
  43. if (this == obj)
  44. return true;
  45. if (obj == null)
  46. return false;
  47. if (getClass() != obj.getClass())
  48. return false;
  49. Person other = (Person) obj;
  50. if (age != other.age)
  51. return false;
  52. if (name == null) {
  53. if (other.name != null)
  54. return false;
  55. } else if (!name.equals(other.name))
  56. return false;
  57. return true;
  58. }
  59. @Override
  60. public int compareTo(Person o) {
  61. int num = this.name.compareTo(o.getName());
  62. if(num != 0){
  63. //先用name排序
  64. return num;
  65. }else{
  66. //如果姓名排序一样则以age进行排序
  67. return this.age - o.getAge();
  68. }
  69. }
  70. }

测试类:

  1. package com.monkey1024.set;
  2. import java.util.TreeSet;
  3. import com.monkey1024.bean.Person;
  4. /**
  5. * TreeSet可以对元素进行排序
  6. * 使用TreeSet存储Person对象
  7. *
  8. */
  9. public class TreeSetTest02 {
  10. public static void main(String[] args) {
  11. TreeSet<Person> ts = new TreeSet<>();
  12. ts.add(new Person("tony", 23));
  13. ts.add(new Person("paul", 20));
  14. ts.add(new Person("andy", 22));
  15. ts.add(new Person("james", 24));
  16. ts.add(new Person("lucy", 21));
  17. System.out.println(ts);
  18. }
  19. }

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

compareTo方法的返回值

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

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

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

compare返回正数

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

compare返回负数

Comparator比较器

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

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

  1. package com.monkey1024.set;
  2. import java.util.Comparator;
  3. import com.monkey1024.bean.Person;
  4. public class CompareByNameLength implements Comparator<Person> {
  5. @Override
  6. public int compare(Person p1, Person p2) {
  7. //根据name长度进行排序
  8. int num = p1.getName().length() - p2.getName().length();
  9. if(num == 0){
  10. num = p1.getName().compareTo(p2.getName());
  11. if(num == 0){
  12. num = p1.getAge() - p2.getAge();
  13. }
  14. }
  15. return num;
  16. }
  17. }

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

  1. package com.monkey1024.set;
  2. import java.util.TreeSet;
  3. import com.monkey1024.bean.Person;
  4. /**
  5. * TreeSet可以对元素进行排序
  6. * 使用TreeSet根据name长度进行排序
  7. *
  8. */
  9. public class TreeSetTest03 {
  10. public static void main(String[] args) {
  11. TreeSet<Person> ts = new TreeSet<>(new CompareByNameLength());
  12. ts.add(new Person("tony", 23));
  13. ts.add(new Person("jordan", 20));
  14. ts.add(new Person("tim", 22));
  15. ts.add(new Person("james", 24));
  16. ts.add(new Person("an", 21));
  17. System.out.println(ts);
  18. }
  19. }

练习

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

答案

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

  1. package com.monkey1024.set.exercise;
  2. import java.util.Comparator;
  3. import java.util.Scanner;
  4. import java.util.TreeSet;
  5. /**
  6. * 问题:将一个字符串中的字符按照字典顺序进行排序,要保留重复的字符。例如输入:java,打印aajv
  7. * 分析:向输入的字符串转换为字符数组,然后向TreeSet中添加字符
  8. */
  9. public class Exercise03 {
  10. public static void main(String[] args) {
  11. Scanner sc = new Scanner(System.in); //创建键盘录入对象
  12. System.out.println("请输入一行字符串:");
  13. String line = sc.nextLine(); //将键盘录入的字符串存储在line中
  14. char[] arr = line.toCharArray(); //将字符串转换成字符数组
  15. TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {
  16. @Override
  17. public int compare(Character c1, Character c2) {
  18. int num = c1.compareTo(c2);
  19. //保存重复数据
  20. return num == 0 ? 1 : num;
  21. }
  22. });
  23. for(char c : arr) {
  24. ts.add(c);
  25. }
  26. for(Character ch : ts) {
  27. System.out.print(ch);
  28. }
  29. }
  30. }

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. HTTP1.0 与HTTP2.0的区别

    一.多路复用 HTTP2.0 使用了多路复用技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级. 二.数据压缩 HTTP1.1不支持header数据压缩,HTTP ...

  2. UVA1482 Playing With Stones —— SG博弈

    题目链接:https://vjudge.net/problem/UVA-1482 题意: 有n堆石子, 每堆石子有ai(ai<=1e18).两个人轮流取石子,要求每次只能从一堆石子中抽取不多于一 ...

  3. poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合

    题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  4. Jquery form表单提交

    起因 由于项目中原先提交from是通过JavaScript指定action,在submit提交的,使用的方式,也不是很标准,造成除了ie之外的浏览器都不能正常的提交数据,做web项目还是要考虑到浏览器 ...

  5. 避免复杂的layout

    layout是浏览器计算元素的几何信息:元素在页面上的的大小和位置. 每个元素都有明确的亦或含蓄的大小信息,这些信息基于我们使用的css以及元素的内容被高和父亲元素. 这个过程在 Chrome, Op ...

  6. POJ 3104 Contestants Division

    Contestants Division Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10597   Accepted:  ...

  7. js 判断滚动条是不是在浏览器底部

    http://jingyan.baidu.com/album/86f4a73e91da7837d65269d5.html?picindex=2

  8. 深入攻克c语言--day04

    1.将包含字符数字的字符串分开,使得分开后的字符串前一部分是数字后一部分是字母.例 如“h1ell2o3” ->”123hello” #include<stdio.h> #inclu ...

  9. alsa音频驱动框架

    sound/core/sound.c 实现了最顶层的file_operations,它起中转作用 sound/core/control.c 实现了控制接口的file_operations sound/ ...

  10. 配置哨兵监控Redis运行情况

    Redis的主从架构,如果master发现故障了,还得手动将slave切换成master继续服务,手动的方式容易造成失误,导致数据丢失,那Redis有没有一种机制可以在master和slave进行监控 ...