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分钟,各位看官请 ...
随机推荐
- 如约而至(walk)
LCA大佬的做法: 考虑暴力的高斯消元,我们优化它. $\sum\limits_{j} gcd(i,j)^{c-d} i^d j^d x_j=b_i$ $\sum\limits_{j} gcd(i,j ...
- Css 进阶学习
以下样式,表示css对第一个li标签无效,第一个以后的样式有效. .nav-pills>li+li { margin-left: 2px } <ul class="nav-pil ...
- H5C3--盒子模型
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【笔记】LR中设置检查点
我们为什么需要在LR中设置检查点?? 我们在录制编写脚本后,通常会进行回放,如果回放通过没有错误.我们就认为脚本是正确的.那么LR怎么区分脚本是否回放正确:基本上所有脚本回放错误都是因为 404错 ...
- 【Scala学习笔记】一、函数式编程的思想
1. 函数是头等值. 在函数编程中,函数也是值,与整数和字符串处于同一地位.函数可以像变量一样被创建,修改,并当成变量一样传递,返回或是在函数中嵌套函数. 函数可以当做参数传递给其他函数. ...
- vmware 与Device/Credential Guard不兼容
解决办法 关闭hv 重启就完了
- Codevs2490 导弹防御塔
2490 导弹防御塔 2490 导弹防御塔 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description Freda的城堡—— ...
- 基于spring-boot的测试桩设计-添加配置文件(properties)
编写测试时,有些内容可以放到配置文件中. 第一步:新增配置文件 conf.properties 第二步:编写配置文件类 MockConf package mock.mockdemo.conf; imp ...
- AspNet 常有功能函数1.0
1.net 获取客户端ip方法(此方法不是很准确) public static string GetIP() { string str; if (!string.IsNullOrEmpty(HttpC ...
- FatMouse' Trade (贪心)
#include <iostream> #include <stdio.h> #include <cstring> #include <cmath> # ...