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分钟,各位看官请 ...
随机推荐
- 微信小程序中自定义swiper轮播图面板指示点的样式
重置样式: .swiper{ width: 100%; height: 240px; margin-bottom: 0.5rem; position:relative; } div.wx-swiper ...
- jQuery事件绑定的四种方法
jQuery中提供了四种绑定事件的方法,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undelegate.off: 一.on()方法(首选方法) ...
- 读书笔记--Head First JQuery目录
1.JQuery入门 2.选择器与方法 3.JQuery事件与函数 4.JQuery Web页面管理 5.JQuery效果与动画 6.JQuery与JavaScript 7.定制函数停工定制效果 8. ...
- VMWare 下 Ubuntu 18.04 的文件共享
突然某天发现 /mnt/hgfs 下共享的文件夹没了... apt-get install open-vm-tools mkdir /mnt/hgfs vmhgfs-fuse .host:/ /mnt ...
- 实用Jupyter Notebook扩展工具——提升你的工作效率
Jupyter Notebook 现已成为数据分析,机器学习的必备工具.因为它可以让数据分析师集中精力向用户解释整个分析过程.通过安装一些扩展工具,可以让你在Jupyter Notebook上的工作效 ...
- java-多线程安全-锁
一 同步函数 1.1 一般的方法 同步的另一种体现形式:同步函数. 同步函数使用的锁是哪个?经过分析:大概猜的是this,因为函数必须被对象调用. 验证:写一个同步代码块,写一个同步函数,如果同步代码 ...
- C 语言中 #pragma 的使用
在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情 ...
- 利用CSS使footer固定在页面底部
1.HTML基本结构 <!DOCTYPEhtml> <htmlxmlns="http://www.w3.org/1999/xhtml"> <headr ...
- php封装的smarty类实例是怎样
* @link http://www.smarty.net/* @copyright 2008 New Digital Group, Inc.* @author Monte Ohrt <mont ...
- system_service进程里 调用SystemManager.getService("activity") 直接返回ams的引用?
我们知道ActivityManager是运行在system_service进程里的,但是最近看代码发现在这个进程的其他服务线程里为了获取AMS调用: ActivityManagerService am ...