java中Comparable 和Comparator
-Comparable接口
接口定义
public interface Comparable<T> {
public int compareTo(T o);
}
该接口中仅仅包含了一个compareTO()函数,
int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值。
实例:
x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。
如何使用:由于Comparable接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。(即可以直接调用.sort()方法实现排序)
如:
package bolg;
public class Person implements Comparable{
String name;
int age;
Person(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 int compareTo(Object o) {
// TODO Auto-generated method stub
int i = 0;
i=name.compareTo(((Person)o).name);
if(0==i)
{
return age-((Person)o).age;
}
else {
return i;
}
}
}
Test
package bolg;
import java.util.Arrays;
public class TestPerson {
public static void main(String args[])
{
Person[] persons = new Person[] { new Person("a", 30), new Person("ab", 20) };
Arrays.sort(persons);
for (int i = 0; i < persons.length; i++) {
Person user = persons[i];
System.out.println(user.getName() + " " + user.getAge());
}
}
}
输出结果
a 30
ab 20
-Comparator接口
接口定义如下
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
(01)若一个类要实现Comparator接口:它一定要实现compareTo(T 1, T 2) 函数,但可以不实现 equals(Object obj) 函数。
为什么可以不实现 equals(Object obj) 函数呢? 因为任何类,默认都是已经实现了equals(Object obj)的。 Java中的一切类都是继承于java.lang.Object,在Object.java中实现了equals(Object obj)函数;所以,其它所有的类也相当于都实现了该函数。
(02) int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
如何使用:Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
- 1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
- 2、可以使用多种排序标准,比如升序、降序等
实例,实现一个比较器,仅仅按照年龄大小排序
package bolg;
import java.util.Comparator;
public class PersonComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
return ((Person) o1).getAge() - ((Person) o2).getAge();
}
}
package bolg;
import java.util.Arrays;
public class TestPerson {
public static void main(String args[])
{
Person[] persons = new Person[] { new Person("a", 30), new Person("ab", 20) };
// Arrays.sort(persons);
Arrays.sort(persons,new PersonComparator());
for (int i = 0; i < persons.length; i++) {
Person user = persons[i];
System.out.println(user.getName() + " " + user.getAge());
}
}
}
输出结果
ab 20
a 30
-Comparable 和 Comparator区别比较
Comparable强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
Comparator强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。思想其实就是java设计模式中的 ----策略者模式
总结:两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码, 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
时间: 2024-10-08 15:21:41