Student.java

package com.sxt.set5;

public class Student{
private String name;
private int age;
private double salary;
public Student(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
}
public Student() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", salary=" + salary + "]";
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Double.doubleToLongBits(salary) != Double.doubleToLongBits(other.salary))
return false;
return true;
} }

SalarySortOfStudent.java

package com.sxt.set5;

import java.util.Comparator;

/*
* TreeSet:有序
* implements Comparator<Student>
* 如果用外部比较器TreeSet必须是实现Comparator接口来实现有序
* 使用泛型是为了在重写compare()方法时,object不用强制转换类型
*/ //外部比较器:在新建类内重写比较规则即compare()方法
public class SalarySortOfStudent implements Comparator<Student>{ //外部比较器的自定义比较规则:按照salary排序
@Override
public int compare(Student o1, Student o2) {
//double类型的比较:不能直接写成return o1.getSalary-o2.getSalary
//因为方法重写 返回值类型为基本数据类型必须一致 所以返回double会转成int会损失精度
if(o1.getSalary() < o2.getSalary()){//降序
return 1;
}else{
return -1;//不能是0即不能返回相等 否则结果会少输出 因为Set接口是(无序,唯一)
}
} }

NameSortOfStudent.java

package com.sxt.set5;

import java.util.Comparator;

/*
* 外部比较器:名字相同时 按照年龄降序输出
* 实现Comparator 重写比较规则即compare()方法
*/ public class NameSortOfStudent implements Comparator<Student>{ @Override
public int compare(Student stu1, Student stu2) {
if(stu1.getName().equals(stu2.getName())){
return stu2.getAge() - stu1.getAge();
}
return stu1.getName().compareTo(stu2.getName());
//String类已经实现了Comparable接口 已经重写了compareTo()方法
} }

TestStudent.java

package com.sxt.set5;
import java.util.HashSet;
/*
* TreeSet 有序的 二叉树(红黑数)
*/
import java.util.Set;
import java.util.TreeSet; public class TestStudent {
public static void main(String[] args) {
//排序之比较规则
SalarySortOfStudent ss = new SalarySortOfStudent();
TreeSet<Student> arr = new TreeSet<>(ss);//ss:外部比较器即比较规则
arr.add(new Student("bbb", 21, 532.2));
arr.add(new Student("ccc", 32, 32.2));
arr.add(new Student("ddd", 11, 352.2));
arr.add(new Student("aaa", 15, 32.2));
//遍历
System.out.println("按照外部比较器按薪资降序排列:");
for(Student s:arr){
System.out.println(s);
}
// 按照外部比较器按薪资(double)降序排列 结果为:
// Student [name=bbb, age=21, salary=532.2]
// Student [name=ddd, age=11, salary=352.2]
// Student [name=aaa, age=15, salary=32.2]
// Student [name=ccc, age=32, salary=32.2] System.out.println("----------------------------------------"); NameSortOfStudent ns = new NameSortOfStudent();
TreeSet<Student> arr1 = new TreeSet<>(ns);//ns:外部比较器即比较规则
arr1.add(new Student("bbb", 21, 532.2));
arr1.add(new Student("ccc", 32, 32.2));
arr1.add(new Student("aaa", 11, 352.2));
arr1.add(new Student("aaa", 15, 32.2));
System.out.println("按照外部比较器按名字排序(如果名字相同则按年龄降序排序):");
for(Student s:arr1){
System.out.println(s);
}
// 按照外部比较器按名字排序(如果名字相同则按年龄降序排序):
// Student [name=aaa, age=15, salary=32.2]
// Student [name=aaa, age=11, salary=352.2]
// Student [name=bbb, age=21, salary=532.2]
// Student [name=ccc, age=32, salary=32.2] }
}

TreeSet之用外部比较器实现自定义有序(重要)的更多相关文章

  1. TreeSet的运用之使用内部比较器实现自定义有序(重要)

    Student.java package com.sxt.set3; /* * TreeSet:有序 * implements Comparable<Student> * 如果用内部比较器 ...

  2. Comparable内部比较器 和 Comparator外部比较器

    1:Comparable a:基本数据类型封装类都继承了Comparable接口 b:TreeSet 和TreeMap集合默认是按照自然顺序排序的 c:继承类中实现compareTo()方法,在类内部 ...

  3. TreeSet 比较器排序 自定义对象

    package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...

  4. JAVA集合四:比较器--类自定义排序

    参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...

  5. 10.TreeSet、比较器

    Comparable和Comparator  Comparable 简介 Comparable 是排序接口.若一个类实现了Comparable接口,就意味着"该类支持排序".  即 ...

  6. java TreeSet 实现存自定义不可重复数据

    本文主要是介绍一下java集合中的比较重要的Set接口下的可实现类TreeSet TreeSet类,底层用二叉树的数据结构 * 集合中以有序的方式插入和抽取元素. * 添加到TreeSet中的元素必须 ...

  7. TreeSet的两种实现方法:Comparable和Comparator(Java比较器)

    Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...

  8. 零基础学习java------day15--------collections用法,比较器,Set(TreeSet,TreeMap),异常

    1. Collections用法 Collections: 集合的工具类public static <T> void sort(List<T> list) 排序,升序publi ...

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

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

随机推荐

  1. Hackerrank--Savita And Friends(最小直径生成树MDST)

    题目链接 After completing her final semester, Savita is back home. She is excited to meet all her friend ...

  2. vmware 与Device/Credential Guard不兼容

    解决办法 关闭hv 重启就完了

  3. Asio与Boost.Asio

    译自http://think-async.com/Asio/AsioAndBoostAsio Asio有两种变体:(非Boost)Asio和Boost.Asio.本文概要描述二者的不同. 1. 源代码 ...

  4. Socket与TcpClient的区别

    原文:Socket与TcpClient的区别 Socket和TcpClient有什么区别 原文:http://wxwinter.spaces.live.com/blog/cns!C36588978AF ...

  5. vue+vant ui+高德地图的选址组件

    首先在index.html引入高德地图的js <script src="https://webapi.amap.com/maps?v=1.4.14&key=你的key" ...

  6. NOIP模拟 9.09

    AK300分 果实计数 (count.pas/.c/.cpp) 时间限制:1s,空间限制32MB 题目描述: 淘淘家有棵奇怪的苹果树,这棵树共有n+1层,标号为0~n.这棵树第0层只有一个节点,为根节 ...

  7. Centos系统Python环境搭建和项目部署

    目录 一.Python 1. 源安装 Python3 2. SCL安装 Python3 3. 虚拟环境venv 4. 安装Flask 5. 安装gunicorn 二.安装Nginx 1. 安装Ngin ...

  8. ant详细介绍

      Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令 ...

  9. Leetcode849.Maximize Distance to Closest Person到最近的人的最大距离

    在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的. 至少有一个空座位,且至少有一人坐在座位上. 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上. 返回 ...

  10. (转载)怎样解决SQL Server内存不断增加问题

    在启用sqlserver服务后,发现进程sqlservr.exe的内存使用量从开始的100多MB持续增加,很快就高达1G以上,造成机器运行缓慢.卡机,严重影响使用.sql server 在查询大数据量 ...