TreeSet类的排序问题
使用TreeSet集合可以向集合中添加数据,形成有序的排列顺序。但是如果我们向集合TreeSet集合中添加自定义的类对象,它会出现什么情况呢?
package chapter_thirteen;
import java.util.Set;
import java.util.TreeSet;
class Person{
private String name;
private String age;
public Person(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}' + '\n';
}
}
/**
* 测试类,由于Person类未实现Comparable接口
* 所以使用TreeSet集合无法输出集合内的数据
*/
public class TreeSetDemo02 {
public static void main(String[] args) {
Set<Person> set = new TreeSet<Person>(); //通过TreeSet实例化Set集合,输入的数据为有序数据
set.add(new Person("张三","21")); //为集合中添加元素
set.add(new Person("李四","22")); //为集合中添加元素
set.add(new Person("王五","23")); //为集合中添加元素
set.add(new Person("赵六","24")); //为集合中添加元素
set.add(new Person("赵六","24")); //为集合中添加元素,重复元素,添加无效
set.add(new Person("赵六","24")); //为集合中添加元素,重复元素,添加无效
set.add(new Person("孙七","25")); //为集合中添加元素
System.out.println(set); //输出数据
}
}
运行结果
Exception in thread "main" java.lang.ClassCastException: chapter_thirteen.Person cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at chapter_thirteen.TreeSetDemo02.main(TreeSetDemo02.java:49)
很明显,如果直接对未设定排序规则的类添加到TreeSet集合中,则会出现错误异常信息,因此自定义的类需要实现Comparable接口(比较器)的比较方法才可以添加到TreeSet集合中,如下面的程序:
package chapter_thirteen;
import java.util.Set;
import java.util.TreeSet;
class Person01 implements Comparable<Person01>{
private String name;
private int age;
public Person01(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Person01{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}' + '\n';
}
@Override
public int compareTo(Person01 o) {
if(this.age > o.age){
return 1;
}else if(this.age < o.age){
return -1;
}else {
return this.name.compareTo(o.name);
}
}
}
public class TreeSetDemo03 {
public static void main(String[] args) {
Set<Person01> set = new TreeSet<Person01>(); //通过TreeSet实例化Set集合,输入的数据为有序数据
set.add(new Person01("张三",21)); //为集合中添加元素
set.add(new Person01("李四",22)); //为集合中添加元素
set.add(new Person01("王五",23)); //为集合中添加元素
set.add(new Person01("赵六",24)); //为集合中添加元素
set.add(new Person01("赵六",24)); //为集合中添加元素,重复元素,添加无效
set.add(new Person01("赵六",24)); //为集合中添加元素,重复元素,添加无效
set.add(new Person01("孙七",25)); //为集合中添加元素
set.add(new Person01("孙八",25)); //为集合中添加元素
System.out.println(set); //输出数据
}
}
运行结果
[Person01{name='张三', age='21'}
, Person01{name='李四', age='22'}
, Person01{name='王五', age='23'}
, Person01{name='赵六', age='24'}
, Person01{name='孙七', age='25'}
, Person01{name='孙八', age='25'}
]
注意,comparaTo()方法如果没有对name属性进行比较的话,若两个对象的年龄相同,会认为是同一个对象,所以运行结果将会改变为
[Person01{name='张三', age='21'}
, Person01{name='李四', age='22'}
, Person01{name='王五', age='23'}
, Person01{name='赵六', age='24'}
, Person01{name='孙七', age='25'}
]