自定义类型怎么实现Comparable接口
//年龄降序
import java.util.TreeSet;
public class ComTest01 {
public static void main(String[] args) {
TreeSet<Person> tr = new TreeSet<>();
tr.add(new Person(12));
tr.add(new Person(23));
tr.add(new Person(11));
tr.add(new Person(10));
for (Person p : tr) {
System.out.println(p);
}
}
}
//放在TreeSet集合中的元素需要实现Comparable接口
class Person implements Comparable<Person> {
int age;
public Person(int age) {
this.age = age;
}
//需要这个方法中编写比较规则
@Override
public int compareTo(Person p) {
return this.age - p.age;
}
//重写toString方法
@Override
public String toString() {
return "Person{" + "age=" + age + '}';
}
}
//年龄升序,如果年龄一样再按照姓名升序
import java.util.TreeSet;
public class ComTest02 {
public static void main(String[] args) {
TreeSet<Vip> vip = new TreeSet<>();
vip.add(new Vip(22, "x"));
vip.add(new Vip(22, "c"));
vip.add(new Vip(13, "a"));
vip.add(new Vip(18, "sf"));
vip.add(new Vip(15, "cd"));
for (Vip v : vip) {
System.out.println(v);
}
}
}
class Vip implements Comparable<Vip> {
int age;
String name;
public Vip(int age, String name) {
this.age = age;
this.name = name;
}
//重写toString方法
@Override
public String toString() {
return "Vip[" + "age=" + age + ", name='" + name + '\'' + ']';
}
@Override
public int compareTo(Vip v) {
//如果年龄相等,比较字符串
if (this.age == v.age) {
//字符串升序
return this.name.compareTo(v.name);
}
return this.age - v.age;
}
}
使用比较器Comparator
import java.util.Comparator;
import java.util.TreeSet;
/**
* 比较器的方式比较
* 年龄升序,年龄相等,姓名升序
*/
public class ComTest03 {
public static void main(String[] args) {
TreeSet<Animal> tr = new TreeSet<>(new Comparator<Animal>() {
@Override
public int compare(Animal o1, Animal o2) {
if (o1.age == o2.age) {
return o1.name.compareTo(o2.name);
}
return o1.age - o2.age;
}
});
tr.add(new Animal(23, "cat"));
tr.add(new Animal(11, "bird"));
tr.add(new Animal(10, "dog"));
tr.add(new Animal(56, "another"));
tr.add(new Animal(10, "fog"));
for (Animal a : tr) {
System.out.println(a);
}
}
}
class Animal {
int age;
String name;
public Animal(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Animal{" + "age=" + age + ", name='" + name + '\'' + '}';
}
}
如果比较规则不会发生改变的时候,或者说比较规则只有一个的时候,建议实现Comparable接口。
如果比较规则有多个,并且需要多个比较规则之间频繁切换的时候,建议使用Comparator接口。
Comparator接口符合OCP编程原则。