Java中自定义类型如何进行比较
假设我们定义了一个Person类,那么如何实现Person类对象的比较呢?
class Person{
public String name;
public String gender;
public int age;
public String ID;
Person(String name, String gender, int age, String id){
this.name = name;
this.gender = gender;
this.age = age;
this.ID = id;
}
}
1.需要实现Comparable接口中的compareTo方法—>自然排序的实现方式
需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序。缺点也很明显,只能选择一个属性来排序。
class Person implements Comparable<Person>{
public String name;
public String gender;
public int age;
public String ID;
Person(String name, String gender, int age, String id){
this.name = name;
this.gender = gender;
this.age = age;
this.ID = id;
}
@Override
public int compareTo(Person o) {
int ret = age - o.age;
if(ret < 0)
return -1;
else if(ret > 0)
return 1;
else
return 0;
}
@Override
public String toString() {
return name + "--" + gender + "--" + age + "--" + ID;
}
public static void main(String[] args) {
Person[] personArr = {new Person("张三", "男", 19, "123456"),
new Person("李四", "男", 18, "138956"),
new Person("王五", "男", 29, "103456")} ;
Arrays.sort(personArr);
System.out.println(Arrays.toString(personArr));
//[李四--男--18--138956, 张三--男--19--123456, 王五--男--29--103456]
}
}
2.实现比较器Comparator接口中的compare方法—>非自然排序的实现方式
需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强。可以根据不同的比较属性构造比较器。
class PersonAgeComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
int ret = o1.age - o2.age;
if(ret < 0)
return -1;
else if(ret > 0)
return 1;
else
return 0;
}
}
class PersonIDComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return -o1.compareTo(o2);
}
}
public static void main(String[] args) {
Person[] personArr = {new Person("张三", "男", 19, "123456"),
new Person("李四", "男", 18, "138956"),
new Person("王五", "男", 29, "103456")} ;
Arrays.sort(personArr, new PersonIDComparator());
System.out.println(Arrays.toString(personArr));
//[王五--男--29--103456, 张三--男--19--123456, 李四--男--18--138956]
Arrays.sort(personArr, new PersonAgeComparator
System.out.println(Arrays.toString(personArr));
//[李四--男--18--138956, 张三--男--19--123456, 王五--男--29--103456]
}