TreeSet之用外部比较器实现自定义有序(重要)
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之用外部比较器实现自定义有序(重要)的更多相关文章
- TreeSet的运用之使用内部比较器实现自定义有序(重要)
Student.java package com.sxt.set3; /* * TreeSet:有序 * implements Comparable<Student> * 如果用内部比较器 ...
- Comparable内部比较器 和 Comparator外部比较器
1:Comparable a:基本数据类型封装类都继承了Comparable接口 b:TreeSet 和TreeMap集合默认是按照自然顺序排序的 c:继承类中实现compareTo()方法,在类内部 ...
- TreeSet 比较器排序 自定义对象
package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...
- JAVA集合四:比较器--类自定义排序
参考链接: HOW2J.CN 前言 对于JAVA集合,都能够用集合的工具类Collections 提供的方法: Collections.sort(List list) Collections.sort ...
- 10.TreeSet、比较器
Comparable和Comparator Comparable 简介 Comparable 是排序接口.若一个类实现了Comparable接口,就意味着"该类支持排序". 即 ...
- java TreeSet 实现存自定义不可重复数据
本文主要是介绍一下java集合中的比较重要的Set接口下的可实现类TreeSet TreeSet类,底层用二叉树的数据结构 * 集合中以有序的方式插入和抽取元素. * 添加到TreeSet中的元素必须 ...
- TreeSet的两种实现方法:Comparable和Comparator(Java比较器)
Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...
- 零基础学习java------day15--------collections用法,比较器,Set(TreeSet,TreeMap),异常
1. Collections用法 Collections: 集合的工具类public static <T> void sort(List<T> list) 排序,升序publi ...
- 【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
上一篇很水的介绍完了TreeMap,这一篇来看看更水的TreeSet. 本文将从以下几个角度进行展开: 1.TreeSet简介和使用栗子 2.TreeSet源码分析 本篇大约需食用10分钟,各位看官请 ...
随机推荐
- js 高亮显示关键字
示例: var defaultEmphasisHandler = function(keyword, data){ var regex = RegExp("("+keyword.r ...
- Linq 之 Where操作
适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式 ...
- spring cloud深入学习(一)-----什么是微服务?什么是rpc?spring cloud简介
近年来,微服务非常的流行,那么为什么是它?简单介绍一下. 为什么是微服务? 微服务架构是一种将单应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,并与轻量级机制(通常是HTTP资 ...
- 本地项目上传git@osc
本地项目使用eclipse的git插件上传到开元中国社区的代码托管平台 1.在托管平台新建项目 2.使用eclipse的git repositories ,在URI中输入新建项目的https路径; 验 ...
- 计算机组成原理(电脑硬件&语言分类)
计算机组成原理 一.电脑硬件配置 CPU :中央处理器(人类的大脑) -飞机 内存:存放一些临时数据(人类的短暂记忆-右脑) -高铁 硬盘:存储永久数据(左脑-长期记忆) - 汽车 输入输出:键盘鼠标 ...
- nginx链接末尾自动补全斜杠
放在locaation里边就行 if (-d $request_filename){ rewrite ^(.*[^/])$ $/ permanent;#加斜杠 } 这样,nginx就会进行判断了,如果 ...
- 使用springMvc对象属性自动封装从jsp向controller传值
controller通过ModelAndView向前台传传递信息 jsp也可以通过model向controller传递信息 这只是其中的一个办法,还有其他几种方式进行前后端的数据交互 如何才能让spr ...
- dom4解析 XML
Java XML解析工具 dom4j介绍及使用实例 Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projec ...
- tcpdump命令介绍
命令格式为:tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae] [-qX] [-r 文件] [所欲捕获的数据内容] 参数: -nn,直接以 IP 及 Port ...
- leetcode 350 easy
350. Intersection of Two Arrays II class Solution { public: vector<int> intersect(vector<in ...