使用TreeSet存储Integer对象

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

  1. package com.sutaoyu.list;
  2.  
  3. import java.util.TreeSet;
  4.  
  5. public class list_test_18 {
  6. public static void main(String[] args) {
  7. TreeSet<Integer> ts = new TreeSet<>();
  8. ts.add(3);
  9. ts.add(3);
  10. ts.add(3);
  11. ts.add(1);
  12. ts.add(1);
  13. ts.add(2);
  14. ts.add(4);
  15. ts.add(5);
  16. ts.add(7);
  17. ts.add(6);
  18. System.out.println(ts);
  19. }
  20. }

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

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

  1. package com.sutaoyu.TreeSet;
  2.  
  3. import java.util.TreeSet;
  4.  
  5. public class TreeSet_test_1 {
  6.  
  7. public static void main(String[] args) {
  8. TreeSet<Person> ts = new TreeSet<>();
  9. ts.add(new Person("tony",23));
  10. ts.add(new Person("paul",20));
  11. ts.add(new Person("andy",22));
  12. ts.add(new Person("james",24));
  13. ts.add(new Person("lucy",21));
  14.  
  15. System.out.println(ts);
  16.  
  17. }
  18. }

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

compareTo方法的返回值

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

  • 当compareTo方法返回0的时候,系统会认为两者一致,所以不会向集合中添加元素
  • 当compareTo方法返回正数的时候,系统将元素存储到右边,所以集合存取顺序一致

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

Comparator比较器

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

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

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

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

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

练习:

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

答案:

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

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

32、TreeSet简介的更多相关文章

  1. Java集合--TreeSet

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

  2. Java中TreeSet的详细用法

    第1部分 TreeSet介绍 TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet, Clonea ...

  3. JAVA中的TreeSet

    TreeSet简介 TreeSet是一个有序的集合,它的作用是提供一个有序的Set集合,它继承于AbstractSet抽象类实现了NavigableSet<E>, Cloneable, j ...

  4. Java集合源码分析(六)TreeSet<E>

    TreeSet简介 TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, j ...

  5. Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例

    概要 这一章,我们对TreeSet进行学习.我们先对TreeSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeSet.内容包括:第1部分 TreeSet介绍第2部分 TreeSe ...

  6. 【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解

    上一篇很水的介绍完了TreeMap,这一篇来看看更水的TreeSet. 本文将从以下几个角度进行展开: 1.TreeSet简介和使用栗子 2.TreeSet源码分析 本篇大约需食用10分钟,各位看官请 ...

  7. (转)TreeSet简单介绍与使用方法

    TreeSet简介 TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet< ...

  8. Set集合之TreeSet类

    TreeSet简介 TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态.与HashSet集合相比,TreeSet还提供了如下 ...

  9. Java特殊数据结构-TreeSet

    资料来源 TreeSet初步入门总结 https://www.cnblogs.com/yzssoft/p/7127894.html TreeSet自然排序与比较器排序精讲 https://blog.c ...

随机推荐

  1. golang build 的简单用法.(菜鸟初学)

    1. golang 里面的 go build 可以编译代码. go build helloworld.go 2. 这里面有一个注意事项事项. 如果引用非go语言的 内置package的话 需要在环境变 ...

  2. 快速用梯度下降法实现一个Logistic Regression 分类器

    前阵子听说一个面试题:你实现一个logistic Regression需要多少分钟?搞数据挖掘的人都会觉得实现这个简单的分类器分分钟就搞定了吧? 因为我做数据挖掘的时候,从来都是顺手用用工具的,尤其是 ...

  3. ASP.NET Core 2 学习笔记

    之前的ASP.NET网站,只要把*.html.*.css.*.jpg.*.png.*.js等静态文件放在项目根目录,默认都可以直接被浏览:但ASP.NET Core 小改了浏览静态文件的方式,默认根目 ...

  4. JAVA里面的“指针”

    JAVA里面的“指针”                 众所周知,在java里面是没有指针的.那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址.那么在Java里 ...

  5. bzoj1683[Usaco2005 Nov]City skyline 城市地平线

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1683 Input 第1行:2个用空格隔开的整数N和W. 第2到N+1行:每行包括2个用空格 ...

  6. BZOJ2276 [Poi2011]Temperature 【单调队列】

    题目链接 BZOJ2276 题解 一开始看错题,以为求的是可以不连续的,想出一个奇怪的线段树,发现空间根本开不下?? 题目要我们求连续的最长可能不下降区间 对于区间\([l,r]\)如果合法,当且仅当 ...

  7. 【poj3133】 Manhattan Wiring

    http://poj.org/problem?id=3133 (题目链接) 题意 $n*m$的网格里有空格和障碍,还有两个$2$和两个$3$.要求把这两个$2$和两个$3$各用一条折线连起来.障碍里不 ...

  8. [CQOI2016] 手机号码 (数位dp)

    link $solution:$ $10^{10} \leq L \leq R < 10^{11}$这个数据范围很容易想到数位$dp$. 依照题意模拟即可. #include<iostre ...

  9. 【最小割/二分图最大独立集】【网络流24题】【P2774】 方格取数问题

    Description 给定一个 \(n~\times~m\) 的矩阵,每个位置有一个正整数,选择一些互不相邻的数,最大化权值和 Limitation \(1~\leq~n,~m~\leq~100\) ...

  10. js正则取出一个字符串小括号中的内容

    var aa="ldfjsldfj(dsfasjfj3124123)"; var result = aa.match(/\(([^)]*)\)/); // 此时result=[&q ...