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] }
}

最新文章

  1. array
  2. iOS给UIimage添加圆角的两种方式
  3. Jpa实体VO使用继承的实体的做法@MappedSuperclass注解的使用
  4. 【转】IPtables学习笔记
  5. RTL8710 ROM 符号表 函数,常量,变量
  6. vs2010 rdlc .net4.0 卸载 Appdomain 时出错。 (异常来自 HRESULT:0x80131015) 解决办法
  7. SQL Server 维护计划实现数据库备份(Step by Step)
  8. cocosjs 触摸
  9. WebRTC手记之本地音频采集
  10. JavaScript 回车 焦点切换(摘抄)
  11. Atitit. .net c# web 跟clientwinform 的ui控件结构比較
  12. html 5 video
  13. [TJOI 2016&amp;HEOI 2016]排序
  14. Java继承时的初始化顺序
  15. Linux进程实践(3) --进程终止与exec函数族
  16. 【转载】Fiddler工具使用介绍(一)
  17. 关于mybatis中传入一个List,字符串数组,或者Map集合作为查询条件的参数
  18. OpenCV库框架结构
  19. angular组件之间的通讯
  20. java byte数组与String的相互转换

热门文章

  1. Mac Eclipse上Android SDK manager闪退的问题!!
  2. IO流4 --- IO流体系 --- 技术搬运工(尚硅谷)
  3. python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁
  4. Slackware网卡配置文件和配置工具
  5. 洛谷P2347 砝码称重 [2017年4月计划 动态规划01]
  6. Leetcode641.Design Circular Deque设计循环双端队列
  7. vue自定义指令之拖动页面的元素
  8. pycharm最新激活码2017
  9. 30分钟学webpack实战
  10. c++ 进制转换函数