TreeSet去重和定制排序

1.TreeSet去重原理

       我们都知道Set集合中的元素都是无序不重复的,而TreeSet中的元素却是有序不重复的,所以在保存没有实现排序功能的对象时,他不知道应该怎么进行进行排序,直接往TreeSet集合中添加没有实现Compareable或者没有传入构造器时就会报错类似下面的错:

Exception in thread “main” java.lang.ClassCastException: Student cannot be castto java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at java.util.TreeSet.add(TreeSet.java:255)
at TreeSetOrderDemo.main(TreeSetOrderDemo.java:18) 

所以我们此时要用TreeSet进行排序,就得手动实现排序功能。

2.两种实现方式

       有两种方式实现,第一种:在TreeSet的构造器中传入一个实现Comparator对象的比较器,或者匿名实现里面方法,int compare(Student obj1, Student obj2)方法返回1则是从小到大排序,反而之从大到小排序,返回0则两个对象相同,不保存。

 2.1 在TreeSet的构造器中传入一个实现Comparator对象的比较器,代码示例如下:

import java.util.Comparator; 
import java.util.Set; 
import java.util.TreeSet;
import lombok.Data;
public class TreeSetOrderDemo { 
/** 
* 演示TreeSet集合中的定制排序,按照学生年龄从小到大排序, 
* @param args 
*/ 
public static void main(String[] args) { 
Set set = new TreeSet<>(**new Comparator() { 
@Override 
public int compare(Student obj1, Student obj2) { 
if (obj1.getAge() > obj2.getAge()) { 
return 1; 
} else { 
if (obj1.getAge() < obj2.getAge()) { 
return -1; 
} 
} 
return 0; 
} 
}**); 
Student stu1 = new Student(“貂蝉”, 17); 
Student stu2 = new Student(“西施”, 25); 
Student stu3 = new Student(“王昭君”, 22); 
Student stu4 = new Student(“杨贵妃”, 19); 
set.add(stu1); 
set.add(stu2); 
set.add(stu3); 
set.add(stu4); 
System.out.println(set); 
} 
}
@Data 
class Student { 
private String name; 
private int age;

public Student(String name, int age) {
    this.name = name;
    this.age = age;
}
} 

打印输出结果:
[Student(name=貂蝉, age=17), Student(name=杨贵妃, age=19), Student(name=王昭君, age=22),Student(name=西施, age=25)]

2.2实现compare接口的方式:

import java.util.Comparator; 
import java.util.Set; 
import java.util.TreeSet;
import lombok.Data;
public class TreeSetOrderDemo { 
/** 
* 演示TreeSet集合中的定制排序,按照学生年龄从小到大排序, 
* @param args 
*/ 
public static void main(String[] args) { 
Set set = new TreeSet<>(); 
Student stu1 = new Student(“貂蝉”, 17); 
Student stu2 = new Student(“西施”, 25); 
Student stu3 = new Student(“王昭君”, 22); 
Student stu4 = new Student(“杨贵妃”, 19); 
set.add(stu1); 
set.add(stu2); 
set.add(stu3); 
set.add(stu4); 
System.out.println(set); 
} 
}
@Data 
class Student implements Comparable { 
private String name; 
private int age;
public Student(String name, int age) {
    this.name = name;
    this.age = age;
}

@Override
public int compareTo(Student stu) {

    return this.age - stu.age;
}

@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;
    return true;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值