----------android培训、java培训、java学习型技术博客、期待与您交流!----------
集合框架:
数组是一种非常有效的数据类型,但是其一旦定义则大小无法改变,缺乏延展性,为了弥补这一应用,增加灵活性,java提供了集合框架(collection framework)。
java的集合框架以基本的集合接口Set、列表List和映射Map为核心,由这些接口及其实现的类,组成了一个集合森林,如下图所示:
Comparable接口
适用于一个类有自然顺序的时候(对于这个自然顺序的理解,我觉得是这样:Comparable中只有一个方法compareTo(),它是比较当前实例和作为参数传入的元素,一个实例,一个参数,说明实例和参数自然具有可比较性)。
下面是Comparable接口的定义:
package java.lang; import java.util.*; public interfaceComparable<T> { publicintcompareTo(T o); }
compareTo()方法:如果排序过程中当前实例出现在参数前,就返回某个负值。如果当前实例出现在参数后,则返回正值。否则,返回零。这里不要求零返回值表示元素相等。零返回值只是表示两个对象排在同一个位置。
Java1.6中实现了Comparable接口的类大概有50左右个。
Comparator接口
有些类是不能用于实现java.lang.Comparable,这时我们可以提供自己的java.lang.Comparator行为。或者,如果你不喜欢缺省的Comparable行为,你也照样可以提供自己的Comparator。
package java.lang; import java.util.*; public interface Comparable<T> { 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<Student_> st=new TreeSet<Student_>(new Student_.TestScoresCompare<Student_>()); st.add(stu5); st.add(stu4); st.add(stu3); st.add(stu2); st.add(stu1); //遍历 Iterator<Student_> 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<T> implements Comparator<T>{ // 注意:Comparator<T>是泛型,实现了这个接口的类也要是泛型 //// 实现比较器 @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中的元素必须实现Comparable接口。或者你必须给他的实现类的构造函数提供一个Comparator(上面那个实例就是这样呀)。
如果添加元素时比较两个元素导致了零返回值,那么新元素就没有添加进去。
public interface SortedSet<E> extends Set<E> { Comparator<? super E> comparator(); // 返回与排序有关联的比较器 SortedSet<E> subSet(E fromElement, E toElement); // 返回指定对象间的元素 SortedSet<E> headSet(E toElement); // 返回从开始到指定元素的集合 SortedSet<E> tailSet(E fromElement); E first(); E last(); }
SortedMap接口
用来保持键Key的有序。
和上面的SortedSet接口类似,为映射的子集包括两个端点提供了访问方法。
TreeMap中实现了SortMap接口。
如果在添加一个键-值对时比较两个键产生了零返回值,那么,原始键对应值被新的值替代。
总结:TreeSet中实现了SortedSet接口,TreeMap中实现了SortMap接口。
----------android培训、java培训、java学习型技术博客、期待与您交流!----------