黑马程序员 java 集合框架中的排序问题(一)

2014-11-24 11:36:18 · 作者: · 浏览: 13
在集合框架中有许多类具有排序功能,如:TreeSet类TreeMap类
为了用“集合框架”的额外部分把排序支持添加到Java2 SDK,版本1.2,核心Java库作了许多更改。像String和Integer类如今实现Comparable接口以提供自然排序顺序。对于那些没有自然顺序的类、或者当您想要一个不同于自然顺序的顺序时,您可以实现Comparator接口来定义您自己的。
Comparable接口
适用于一个类有自然顺序的时候(对于这个自然顺序的理解,我觉得是这样:Comparable中只有一个方法compareTo(),它是比较当前实例和作为参数传入的元素,一个实例,一个参数,说明实例和参数自然具有可比较性)。
下面是Comparable接口的定义:
[java]
package java.lang;
import java.util.*;
public interfaceComparable {
publicintcompareTo(T o);
}
compareTo()方法:如果排序过程中当前实例出现在参数前,就返回某个负值。如果当前实例出现在参数后,则返回正值。否则,返回零。这里不要求零返回值表示元素相等。零返回值只是表示两个对象排在同一个位置。
Java1.6中实现了Comparable接口的类大概有50左右个。
Comparator接口
有些类是不能用于实现java.lang.Comparable,这时我们可以提供自己的java.lang.Comparator行为。或者,如果你不喜欢缺省的Comparable行为,你也照样可以提供自己的Comparator。
[java]
package java.lang;
import java.util.*;
public interface Comparable {
public int compareTo(T o);
}
实例:
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* 10、 定义一个学生类, 需要有姓名, 年龄, 考试成绩三个成员属性,
* 创建5个对象, 属性可为任意值. 编程对这5个对象按成绩排序,并将结果输出。
* (提示,用TreeSet和Comparator实现)
*
* *******************按成绩小>大排序****************
* @author jin
*
*/
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student_ stu1=new Student_("Joyce", 21, 98);
Student_ stu2=new Student_("kelvin", 25, 95);
Student_ stu3=new Student_("kelvun", 29, 89);
Student_ stu4=new Student_("Judy", 25, 92);
Student_ stu5=new Student_("phil", 43, 93);
// 创建TreeSet
Set st=new TreeSet(new Student_.TestScoresCompare());
st.add(stu5); st.add(stu4); st.add(stu3); st.add(stu2); st.add(stu1);
//遍历
Iterator it=st.iterator();
while(it.hasNext()){
Student_ student=it.next();
System.out.println(student.getName()+" : "+student.getAge()+" : "+student.getTest_scores());
}
}
}
class Student_{
// 三个属性
private String name;
private int age;
private int test_scores;
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public int getTest_scores(){
return this.test_scores;
}
Student_(String name, int age, int test_scores){// 构造器
this.name=name;
this.age=age;
this.test_scores=test_scores;
}
// 这里为什么要用静态类呢?
static class TestScoresCompare implements Comparator{
// 注意:Comparator是泛型,实现了这个接口的类也要是泛型
//// 实现比较器
@Override
public int compare(T o1, T o2) {
Student_ stu1=(Student_)o1;
Student_ stu2=(Student_)o2;
if(stu1.test_scores>stu2.test_scores){
return 1;
}
return -1;
}
}
// 泛型参数可以出现在:类,接口,成员方法,内嵌类(接口)中
}
另外,“集合框架”提供了两个特殊的接口:SortedSet接口 和 SortMap接口
SortedSet接口
接口为集的子集和它的两端(即头和尾)提供了访问方法。
从treeSet类的定义中可以发现,TreeSet中实现了SortedSet接口.
添加到SortedSet中的