java提高(7)---TreeSet--排序
TreeSet(一)
一、TreeSet定义:
- import java.util.TreeSet;
- /** TreeSet集合的特点:排序和唯一
- *
- * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。
- */
- public class TreeTest1 {
- public static void main(String[] args) {
- // 创建集合对象
- // 自然顺序进行排序
- TreeSet<Integer> treeSet = new TreeSet<Integer>();
- // 创建元素并添加
- treeSet.add(8);
- treeSet.add(4);
- treeSet.add(5);
- treeSet.add(6);
- treeSet.add(6);
- // 遍历
- for(Integer i : treeSet){
- System.out.print(i);
- }
- }
- }
- /*后台输出:4568 重复会被覆盖*/
(2)如果存入对象怎么排序,记住如果是对象一定要重写Comparator方法
People对象
- public class People implements Comparable {
- private String name;
- private String sex;
- private int age;
- /*提供set和get方法,全参和无参构造方法*/
- @Override
- public int compareTo(Object o) {
- People people = (People) o;
- if (people.age > this.age) {
- return 1;
- }
- if (this.age == people.age) {
- return this.name.compareTo(people.name);
- }
- if ( people.age<this.age ) {
- return -1;
- }
- return 0;
- }
- }
测试类
- public class SortTest {
- public static void main(String[] args) {
- People people1 = new People("小a", "男", 18);
- People people2 = new People("小a", "女", 16);
- People people3 = new People("小c", "女", 18);
- People people4 = new People("小b", "女", 22);
- People people5 = new People("小d", "男", 19);
- Set<People> treeSet = new TreeSet<People>();
- treeSet.add(people1);
- treeSet.add(people2);
- treeSet.add(people3);
- treeSet.add(people4);
- treeSet.add(people5);
- Iterator iterator = treeSet.iterator();
- while (iterator.hasNext()) {
- People people = (People) iterator.next();
- System.out.println("姓名:" + people.getName() + "\t年龄:" + people.getAge());
- }
- }
- }
- public class Student {
- private String name;
- private int chinese;
- private int math;
- private int english;
- /*提供set和get方法,同时提供无参数,有参数构造方法*/
- //同时单独要加上getSum方法
- public int getSum(){
- return this.chinese + this.english + this.math;
- }
- }
测试类
- import java.util.Iterator;
- import java.util.TreeSet;
- public class TreeTest2 {
- public static void main(String[] args) {
- Student student1=new Student("小明", 80, 90, 70);
- Student student2=new Student("小王", 60, 80, 90);
- Student student3=new Student("小钱", 100, 100, 80);
- Student student4=new Student("小徐", 20, 10, 90);
- Student student5=new Student("小李", 80, 80, 80);
- Student student6=new Student("小李", 70, 80, 90);
- TreeSet<Student> treeSet=new TreeSet(new MyComparable());
- treeSet.add(student1);
- treeSet.add(student2);
- treeSet.add(student3);
- treeSet.add(student4);
- treeSet.add(student5);
- treeSet.add(student6);
- Iterator<Student> iterator=treeSet.iterator();
- while(iterator.hasNext()){
- Student student=iterator.next();
- System.out.println(student.toString());
- }
- }
- }
MyComparable类
- import java.util.Comparator;
- public class MyComparable implements Comparator<Student>{
- @Override
- public int compare(Student s1, Student s2) {
- // 总分从高到低(注意这里是s2减s1)
- int num = s2.getSum() - s1.getSum();
- if(num>0){
- return 1;
- }
- if(num<0){
- return -1;
- }
- if(num==0){
- //这步非常关键,没有这个如果总成绩相同名字不同 ,那set集合就默认是相同元素,就会被覆盖掉
- return s2.getName().compareTo(s1.getName());
- }
- return 0;
- }
- }
- /**
- * 是不是很奇怪为什么只有五条数据,而不是六条,那是因为有一条数据被覆盖了。
- * 你的Comparator实现类,是先比较成绩,成绩相同,在比较名字,那如果总成绩
- * 相同,姓名也相同,那不是默认是重复数据,TreeSet当然给你覆盖掉了。所以这
- * 里有个小李被覆盖掉了。那如何写才规范,下面这样就不会出现覆盖。
- */
- @Override
- // 创建一个TreeSet集合
- public int compare(Student s1, Student s2) {
- // 总分从高到低(注意这里是s2减s1)
- int num = s2.getSum() - s1.getSum();
- // 总分相同的不一定语文相同
- int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
- // 总分相同的不一定数学相同
- int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;
- // 总分相同的不一定英语相同
- int num4 = num3 == 0 ? s1.getEnglish() - s2.getEnglish() : num3;
- // 姓名还不一定相同
- int num5 = num4 == 0 ? s1.getName().compareTo(s2.getName()) : num4;
- return num5;
- }
- import java.util.Iterator;
- import java.util.TreeSet;
- import java.util.Random;
- /*
- * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
- *
- * 分析:
- * A:创建随机数对象
- * B:创建一个TreeSet集合
- * C:判断集合的长度是不是小于10
- * 是:就创建一个随机数添加
- * 否:不搭理它
- * D:遍历TreeSet集合
- */
- public class HashSetDemo {
- public static void main(String[] args) {
- // 创建随机数对象
- Random r = new Random();
- // 创建一个Set集合
- TreeSet<Integer> treeSet = new TreeSet<Integer>();
- // 判断集合的长度是不是小于10
- while (treeSet.size() < 10) {
- int x = r.nextInt(20) + 1;
- treeSet.add(x);
- }
- // 遍历Set集合
- for (int x : treeSet) {
- System.out.println(x);
- }
- }
- }
java提高(7)---TreeSet--排序的更多相关文章
- Java提高篇(二八)------TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...
- Java提高十七:TreeSet 深入分析
前一篇我们分析了TreeMap,接下来我们分析TreeSet,比较有意思的地方是,似乎有Map和Set的地方,Set几乎都成了Map的一个马甲.此话怎讲呢?在前面一篇讨论HashMap和HashSet ...
- java提高篇(三十)-----Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
- Java提高篇(二七)-----TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- java提高篇(二四)-----HashSet
在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素. ...
- Java提高篇---TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- java提高篇---Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
- Java深入了解TreeSet
Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一.那TreeSet为什么能保证元素唯一,它是怎样排序的呢?先看一段代码: publi ...
- TreeSet排序,存储自己定义对象,自己定义比較器演示样例
Set:无序.不能够反复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:推断元素的hashCode值是否同样. 假设同样,还会继续推断元素的equals方法.是 ...
- Java HashSet和TreeSet【笔记】
Java HashSet和TreeSet[笔记] PS:HashSet.TreeSet 两个类是在 Map 的基础上组装起来的类 HashSet 类注释 1.底层实现基于 HashMap,所以迭代时不 ...
随机推荐
- 《修炼之道:.NET开发要点精讲》读书笔记(一)
CLR 公共语言运行库 没有CLR的存在,就不能讲该中间件转换成对应操作系统中的机器指令. 程序集是非完全编译的产物,它兼备了源代码和本地代码的特性,是一种介于源代码和本地代码之间的独立存在的一种数据 ...
- 如何高效的学习 TensorFlow 代码?
https://www.zhihu.com/question/41667903 Linux[公共基础]:TensorFlow的主要运行平台之一就是Linux,但是正式版对Windows的支持日趋完善, ...
- Programming for Everyone !
Hello Internet ! This blog is to store my algorithm practices. Since Evernote code blocks do not sho ...
- vue history模式 apache配置
我的服务器apache 版本是2.4.6 看文档上面说加那些代码,但是加上去重启服务器就不能重启,显示代码错误,然后百度查开启mod_rewrite这个重写URL 弄了半天也不会,百度上面的不知道是不 ...
- Web3D
https://baike.baidu.com/item/WEB%203D/11066359?fr=aladdin https://zhidao.baidu.com/question/17325151 ...
- Python从入门到精通之Sixth!
补充:enumerate 函数用于遍历序列(元组tuple.列表list.字典dict)中的元素以及它们的下标: >>> for i,j in enumerate(('a','b', ...
- Linux下mysql定时自动备份并FTP到远程脚本
1.添加backupmysqleveryday.sh(vi /data/shell/backupmysqleveryday.sh) #!/bin/sh #this shell is user for ...
- ajax动态刷新的元素,导致绑定事件失效
jquery事件绑定有2种方式: 1,普通事件绑定: $('元素').click(function(){}); 2, 事件代理或者叫事件委托 $('#chatPanelList').on('click ...
- java跨域问题
public class SimpleCORSFilter implements Filter{ @Override public void destroy() { } @Override publi ...
- Windows平台最方便最易用的法语输入法
原文:http://wenwen.sogou.com/z/q1700007921.htm 对于XP,在“控制面板”中选择“输入法区域设置”,单击“更改”,出现一个“设置”框:选择“添加”,然后选择“法 ...