java基础:java集合之有序


在集合框架中有许多类具有排序功能,如:TreeSetTreeMap

为了用“集合框架”的额外部分把排序支持添加到Java2 SDK,版本1.2,核心Java库作了许多更改。像StringInteger类如今实现Comparable接口以提供自然排序顺序。对于那些没有自然顺序的类、或者当您想要一个不同于自然顺序的顺序时,您可以实现Comparator接口来定义您自己的。

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接口。

如果在添加一个键-值对时比较两个键产生了零返回值,那么,原始键对应值被新的值替代。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值