在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。本文为大家介绍java比较器的使用。
java比较器的使用
对于一个实现了Comparable接口的对象,该接口只能实现一次。如果在一个集合里面需要使用id排序,而在另外一个集合里需要按名字排序这时就需要在这个集合里面指定比较器。
Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。Comparator位于包java.util下,而Comparable位于包java.lang下
Comparable接口声明了compareTo(Object o)方法
Comparator 接口声明了compare(Object o1,Object o2)方法
eg:
第一个树集是按照对象默认的id排序,第二个树集由指定的构造器按照name 排序
package com.mapbar.util;
import java.util.Comparator;
import java.util.TreeSet;
/**
*
* Class Employee.java
*
* Description
*
* Company mapbar
*
* author Chenll E-mail: Chenll@mapbar.com
*
* Version 1.0
*
* Date 2012-8-28 下午05:20:49
*/
public class Employee implements Comparable《Employee》 {
private int id;
private String name;
public Employee(int id, String name) {
this.id = id;
this.name = name;
}
//重写equals
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (this == o) {
return true;
}
if (!(o instanceof Employee)) {
return false;
}
Employee employee = (Employee) o;
return (this.id == employee.id) && (this.name.equals(employee.name));
}
//重写hashCode
public int hashCode() {
int result = 17;
result = 37 * result + id;
result = 37 * result + name.hashCode();
return result;
}
//重写toString
public String toString() {
return “id:” + id + “,name:” + name + “”;
}
public int compareTo(Employee employee) {
// 升序
return this.id - employee.id;
// 降序
// return employee.id - this.id;
}
public String getName() {
return name;
}
public static void main(String[] args) {
// 使用的是实现了Compable 接口对象默认的排序方式,按id升序排序
SortedSet《Employee》 treeSet = new TreeSet《Employee》();
treeSet.add(new Employee(2, “zhang”));
treeSet.add(new Employee(1, “chen”));
treeSet.add(new Employee(3, “wang”));
System.out.println(treeSet.toString());
// 使用比较器,指定其排序方式
SortedSet《Employee》 treeSet2 = new TreeSet《Employee》(
// 函数对象:既匿名内部类的实例,这个瞬时的对象永远不会被别的对象引用
new Comparator《Employee》() {
public int compare(Employee emp1, Employee emp2) {
String name1 = emp1.getName();
String name2 = emp2.getName();
return name1.compareTo(name2);
}
});
treeSet2.add(new Employee(2, “zhang”));
treeSet2.add(new Employee(1, “chen”));
treeSet2.add(new Employee(3, “wang”));
System.out.println(treeSet2.toString());
}
}
结果:
[id:1,name:chen, id:2,name:zhang, id:3,name:wang]
[id:1,name:chen, id:3,name:wang, id:2,name:zhang]
评论
查看更多