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,所以迭代时不 ...
随机推荐
- 描点的改进:运用chart画图。
主要是利用Chart画图: 通过选中一部分曲线进行图像的放大和缩小,最小值为1格. 先计算最大值和最小差值.然后赋值给AxisY.Minimum 和AxisY.Maximum.x轴初始显示数目:Axi ...
- # 2019-2020-4 《Java 程序设计》第六周总结
2019-2020-4 <Java 程序设计>第六周知识总结 第七章:内部类与异常类 1.内部类 (1)类可以有两种重要的成员:成员变量和方法,类还可以有一种成员:内部类. (2)java ...
- Js2WordCloud 词云用法
1.引入 npm 安装: npm install js2wordcloud --save 通过script引入: <script src="dist/js2wordcloud.min. ...
- 85、int 、NSInteger、NSUInteger、NSNumber的区别和联系
NSNumber是NSValue的一个子类,它是一个对象来存储数字值包括bool型,它提供了一系列的方法来存储char a signed or unsigned char, short int, in ...
- Hibernate中的实体规则、对象状态和进阶-一级缓存
一.hibernate中的实体规则 1.实体类创建的注意事项 2.主键类型 3.主键生成策略 (1)代理主键 (2)自然主键 二.hibernate中的对象状态 1.对象分为三种状态 2.三种状态的转 ...
- SSH通过密钥登陆
A服务器上操作 ssh-keygen -t rsa/dsa 后面所带参数rsa/dsa为加密方式,默认为dsa [root@localhost ~]# ssh-keygen Generating pu ...
- Python中使用cx_Oracle调用Oracle存储过程
import cx_Oracle as cx import datetime def execute_sql(): # 声明变量 date_time = datetime.datetime.now() ...
- 手机端-万种bt在线观看器,安卓正版下载
安卓正版下载, 点击下载 无广告,完全免费!寻找任何你想要的资源!
- jdk环境变量的设置
一.jdk下载网址 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 二.环境变 ...
- 《JavaScript 高级程序设计》读书笔记三 基本概念
一 语法 区分大小写,驼峰式书写方式: 严格模式:“use strict”: 二 数据类型 a. 基本数据类型: undefined 声明变量未初始化 null 空指针,可以释放内存 Boole ...