java.lang.Comparable接口详解(二)

2014-11-24 07:37:28 · 作者: · 浏览: 1
(){
return "Id: " + id + "/tName: " + name + "/tAge: " + age;
}


// 实现 Comparable 接口的抽象方法,定义排序规则
@Override
public int compareTo(Object o) {

Person per = (Person)o;
return this.id - per.id;
}


}
package com.itm.test;

/***********
利用 Comparable 接口创建自己的类的排序顺序,只是实现 compareTo() 方法的问题。

通常就是依赖几个数据成员的自然排序。同时类也应该覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个哈希码。 www.2cto.com

这个接口的作用:如果数组或者集合中的(类)元素实现了该接口的话 ,

我们就可以调用 Collections.sort 和 Arrays.sort 排序,或应用于有序集合 TreeSet 和 TreeMap 中。
* @author
*
*/
@SuppressWarnings("unchecked")
public class Person implements java.lang.Comparable{

private final int id;

private String name;

private int age;

public Person(int id,String name,int age){
super();
this.id = id;
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;
}

public int getId() {
return id;
}

public String toString(){
return "Id: " + id + "/tName: " + name + "/tAge: " + age;
}


// 实现 Comparable 接口的抽象方法,定义排序规则
@Override
public int compareTo(Object o) {

Person per = (Person)o;
return this.id - per.id;
}


}

[java]
package com.itm.test;

import java.util.TreeSet;

public class TestComparable {

/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
TreeSet tree = new TreeSet();
tree.add(new Person(1,"小名",15));
tree.add(new Person(4,"小刚",16));
tree.add(new Person(3,"小花",17));
tree.add(new Person(2,"金刚",100));

// Iterator it = tree.iterator();
// while(it.hasNext()){
// Person employee = (Person) it.next();
// System.out.println(employee);
// }

for(Object o : tree){
System.out.println(o);
}

}

}
package com.itm.test;

import java.util.TreeSet;

public class TestComparable {

/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {
TreeSet tree = new TreeSet();
tree.add(new Person(1,"小名",15));
tree.add(new Person(4,"小刚",16));
tree.add(new Person(3,"小花",17));
tree.add(new Person(2,"金刚",100));

// Iterator it = tree.iterator();
// while(it.hasNext()){
// Person employee = (Person) it.next();
// System.out.println(employee);
// }

for(Object o : tree){
System.out.println(o);
}

}

}


说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者都吃饱撑着没事做吗?

再谈Comparator接口之前,大家应该先了解一个叫“策略模式”的东东。一下是百度百科对策略模式的描写:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)


之所以要谈到策略模式,就是因为Comparator接口其实就是一种策略模式的实践。实现Comparator接口的类必然就会实现一个compareTo(Object o1, Object o2)的方法,而这个方法就是算法中的一部分,所有使用了compareTo方法的类都不会关心compareTo是如何工作的,只关心他的返回值,这也是面向对象中著名的封装特性。

那Comparator接口应该如何使用呢?别急,首先我们要先对Person类进行一下处理,因为我们现在使用Comparator接口,所以Comparable接口就可以光荣的退休了


摘自 无间道