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,所以迭代时不 ...
随机推荐
- ----改写superheros的json以及上传到github----
以下为js代码: var header = document.querySelector('header'); var section = document.querySelector('sectio ...
- Chapter5_初始化与清理_构造器初始化
一.构造器初始化的基本顺序 在使用构造器进行初始化时,最需要注意的是初始化的顺序,这种方法可以给初始化的顺序带来很大的灵活性.看如下的一个例子. class Window{ Window(int ma ...
- python中os.path 与sys.path
看别人写的代码,会发现两个和路径设置有关的模块 os 和sys.我对这两个模块也不是特别了解.只是记录一下自己看到的,学到的. python 中我们会使用这两个模块和文件路径, 创建文件 之类的 操作 ...
- Java:Copy-On-Write容器
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...
- 受限filterbanks
2.Related works to filterbank learning 虽然DNN-HMM模型的性能比GMM-HMM模型相比,具有很大的优势,但是训练集和测试集之间的失配问题,也使得DNN-HM ...
- 学习Acegi应用到实际项目中(6)
在企业应用中,用户的用户名.密码和角色等信息一般存放在RDBMS(关系数据库)中.前面几节我们采用的是InMemoryDaoImpl,即基于内存的存放方式.这节我们将采用RDBMS存储用户信息. Us ...
- 在JAVA中对于类,对象,继承,多态的看法
这是我第一次学高级语言.很抱歉选择了JAVA,目标是开发一款可以上线的APP. 类:是建立对象的一个模板,就是系列产品中的基础款图纸.只是图纸而已.不是产品. 对象:是一个可以操作的对象.新建一个对象 ...
- tomcat配置层了解一下 idea打包 java打包部署
Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml配置文件中的Connector节点 ...
- JavaScript基础视频教程总结(111-120章)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- influence maximization
Robust Influence Maximization 首先简要介绍一下这个问题:在一个社交网络图中寻找固定数量的节点,使得这些节点对所有节点的影响值尽可能的大.这个问题由于在病毒式营销,谣言监控 ...