创建一个教师类(teacher),属性age name salary,创建10个教师对象,装入treeset中,通过设置teacher类,保证age大的在前面,age相同salary小的在前面,salary相同 name小的在前面。三个属性相同的为同一对象,不能重复添加进集合
import java.text.Collator;
import java.util.*;
/**
* 老师类
*/
public class Teacher implements Comparable<Teacher> {
private int age;//年龄
private String name;//名字
private double salary;//薪水
/**
* 存储自定义对象时,想要达到去重的效果.就需要重写equals和hashcode
* 1. 当调用add方法存储元素时,会先调用元素的hashcode方法获得对象的地址
* 2. 拿着对象的地址与之前集合中已经存在的地址比较
* 3. 如果hashcode值不一样,直接存储
* 4. 如果hashcode值一样,继续调用元素的equals和原来已存在的元素比较内容
* 5. 如果equals比较的内容也一样.那么该元素就不向集合中存储.
* 6. 如果equals比较的内容不一样,那么就认为该元素与集合中原有的元素不相同,就
* 向集合中存储
*
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
return age == teacher.age &&
Double.compare(teacher.salary, salary) == 0 &&
Objects.equals(name, teacher.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name, salary);
}
public Teacher(){}
public Teacher(int age, String name, double salary) {
this.age = age;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "Teacher{" +
"age=" + age +
", name='" + name + '\'' +
", salary=" + salary +
'}';
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
/**
* compareTo 自然比较方法。
* 如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
* 返回 零 即认为重复,不存储
* 返回 负整数 即插入的元素放入之前那个元素前面
* 返回 正整数 即插入的元素放入之前那个元素后面
* --------------
* 该对象是正在存储的元素对象,即this
* 指定对象: 之前已存在元素
*/
@Override
public int compareTo(Teacher o) {
if(this.age==o.age&&this.name.equals(o.name)&&this.salary==o.salary){
return 0;
}
if(o.age == this.age){
if(this.salary==o.salary){
//根据名字长度
// int a = o.name.length()-this.name.length();
// if(a==0){
// return -1;
// }
// return a;
//根据名字内容
//return o.name.compareTo(this.name);
//根据名字内容中文汉字排序
Comparator<Object> CHINA_COMPARE = Collator.getInstance(java.util.Locale.CHINA);
return CHINA_COMPARE.compare(this.name,o.name);
}
return (int) (this.salary-o.salary);
}
return o.age-this.age;
}
}
import java.util.TreeSet;
/**
* 教师测试排序类
*/
public class TEstTeacher {
public static void main(String[] args) {
TreeSet<Teacher> teachers = new TreeSet<>();
teachers.add(new Teacher(18,"鲁班",1822));
teachers.add(new Teacher(19,"妲己",1500));
teachers.add(new Teacher(20,"英才",1800));
teachers.add(new Teacher(21,"见过",4000));
teachers.add(new Teacher(22,"爱国",1422));
teachers.add(new Teacher(22,"翠花",4222));
teachers.add(new Teacher(40,"天生",7422));
teachers.add(new Teacher(40,"崔2",1880));
teachers.add(new Teacher(18,"杨盖飞",1542));
teachers.add(new Teacher(40,"啊",1880));
teachers.add(new Teacher(58,"景区",1822));
teachers.add(new Teacher(40,"啊",1880));
teachers.add(new Teacher(40,"吧",1880));
for (Teacher t :teachers){
System.out.println(t);
}
}
}
效果图