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.SortedSet;
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]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值