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);
- }
- }
- }
TreeSet(一)--排序的更多相关文章
- Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序
package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...
- TreeSet集合排序方式一:自然排序Comparable
TreeSet集合默认会进行排序.因此必须有排序,如果没有就会报类型转换异常. 自然排序 Person class->实现Comparable,实现compareTo()方法 package H ...
- Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序
/** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...
- TreeSet 比较器排序 自定义对象
package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...
- TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...
- TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素
TreeSet和TreeMap排序时比较元素要求元素对象必须实现Comparable接口 Collections的sort方法比较元素有两种方法: 元素对象实现Comparable接口 实体类Dog ...
- java TreeSet的排序之定制排序
TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2 ...
- java TreeSet的排序之自然排序
TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int com ...
- TreeSet集合排序方式二:定制排序Comparator
Comparator有两种实现方式: 1,匿名内部类 2,创建一个类用于实现Comparator,该类创建的对象就是比较器 Person类 public class Person implements ...
随机推荐
- python异步并发模块concurrent.futures入门详解
concurrent.futures是一个非常简单易用的库,主要用来实现多线程和多进程的异步并发. 本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo. ...
- Oracle官方非托管Odac驱动与Oracle官方托管odac驱动
方便自己,方便他人,记一次连接oracle的经历,使用 [Oracle官方非托管Odac驱动,Oracle.DataAccess.Client]连接数据库的时候程序会报错,找了很久都不知道是什么原因, ...
- 前端开发:如何写一手漂亮的 Vue
前几日听到一句生猛与激励并存,可怕与尴尬同在,最无奈也无解的话:"90后,你的中年危机已经杀到".这令我很受触动.显然,这有些夸张了,但就目前这日复一日的庸碌下去,眨眼的功夫,那情 ...
- js实现获取短信验证码倒计时
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- ubuntu 常用软件安装
安装ubuntu远程图形界面 sudo apt-get install xrdp (sudo apt-get install .. 用于安装软件的命令 ) sudo apt-get install ...
- 一个比较实用的商业级图表Echarts
了解了解 ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼 ...
- Linux学习(十二)mkpasswd、su、sudo、限制root远程登录
一.mkpasswd mkpasswd用来生成随机密码字符串.可以指定长度和特殊字符的长度: [root@ruanwenwu01 ~]# mkpasswd O7.alw5Wq [root@ruanwe ...
- VS2008中C#开发webservice简单实例
1.创建工程 文件-> 新建->网站 如下图. 工程建好后,会自动添加如下代码: using System; using System.Linq; using System.Web; us ...
- Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException):
用windows连接hadoop集群执行mapreduce任务的时候出现以下错误: org.apache.hadoop.security.AccessControlException:Permissi ...
- HTML5网页音乐播放器
1功能介绍 HTML5中推出了音视频标签,可以让我们不借助其他插件就可以直接播放音视频.下面我们就利用H5的audio标签及其相关属性和方法来制作一个简单的音乐播放器.主要包括以下几个功能: 1.播放 ...