TreeSet添加元素并输出
import java.util.Arrays;
import java.util.TreeSet;
public class Test {
public static <E> void main(String[] args) {
TreeSet<Cat> ts = new TreeSet<>();
ts.add(new Cat("熊1", 17,'公'));
ts.add(new Cat("熊2", 18,'公'));
ts.add(new Cat("熊3", 19,'公'));
Iterator<Cat> it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
执行结果会出现一个异常:java.lang.ClassCastException
因为我们需要给Cat类制定一个排序规则,没有的话就会出现异常
解决办法一
新建一个CatComparator类实现Comparator接口
项目目录:
import java.util.Comparator;
public class CatComparator implements Comparator<Cat>{
@Override
public int compare(Cat o1, Cat o2) {
//使用年龄来进行排序
return o1.getAge() - o2.getAge();
}
}
然后在TreeSet后面加入比较器
遍历结果
解决办法二
使用外置比较器临时指定排序规则
应用场景:类是别人写的,不能动别人写好的类
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class Test {
public static <E> void main(String[] args) {
TreeSet<Cat> ts = new TreeSet<>(new Comparator<Cat>() {
@Override
public int compare(Cat o1, Cat o2) {
//根据年龄排序
return o1.getAge() - o2.getAge();
}
});
ts.add(new Cat("熊1", 6,'公'));
ts.add(new Cat("熊2", 56,'公'));
ts.add(new Cat("熊3", 3,'公'));
Iterator<Cat> it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
解决办法三
Cat类中实现Comparable接口,重写compareTo方法
重写过后的Cat类
package com.zyk.test1;
public class Cat implements Comparable<Cat>{
private String name;
private int age;
private char sex;
public Cat() {
// TODO Auto-generated constructor stub
}
public Cat(String name, int age, char sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "Cat [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
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 char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public int compareTo(Cat o) {
// TODO Auto-generated method stub
return this.getAge() - o.getAge();
}
}