首页 > 代码库 > Comparable接口

Comparable接口

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------

Comparable接口
概述:此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类
的 compareTo 方法被称为它的自然比较方法。

用途:实现了Comparable接口的类在一个Collection(集合)里是可以排序的,而排序的规则是
按照你实现的Comparable里的抽象方法compareTo(Object o) 方法来决定的。 
compareTo方法当前这个对象与指定的对象进行顺序比较,当该对象小于、等于或大于指定对象
时,分别返回一个负整数、 0 或正整数,如果无法进行比较,则抛出ClassCastException 异常。

import java.util.*;

//指定比较器,让其按照自己需要的顺序排序,下面指定按姓名排序
class StuNameComparable implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
int num=s1.getName().compareTo(s2.getName());
if(num==0)
{
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
}
return num;
}
}

class MapTest 
{
public static void main(String[] args) 
{
TreeMap<Student,String> hm=new TreeMap<Student,String>();
hm.put(new Student("bdd",21),"beijing");
hm.put(new Student("ass",22),"shanghai");
hm.put(new Student("yyy",23),"wuhan");
hm.put(new Student("ccc",24),"tianjing");
//entrySet()
Set<Map.Entry<Student,String>> entrySet=hm.entrySet();
Iterator<Map.Entry<Student,String>> it=entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Student,String> me=it.next();
String add=me.getValue();
Student s=me.getKey();
System.out.println(s.getName()+","+s.getAge()+"::"+add);
}
}
}
//学生对象实现Comparable接口,让其必备比较性。
class Student implements Comparable<Student>
{
private String name;
private int age;
//覆写compareTo()方法,让其按照age排序
public int compareTo(Student s)
{
int num=new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
{
return this.name.compareTo(s.name);
}
return num;
}
Student(String name,int age)
{
this.name=name;
this.age=age;
}
public int hashCode()
{
return name.hashCode()+age*39;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return this.name.equals(s.name)&&this.age==s.age;
}
public String getName()
{return name;}
public int getAge()
{return age;}
}

结果:
bdd,21::beijing
ass,22::shanghai
yyy,23::wuhan
ccc,24::tianjing

下面传入指定比较器:按姓名排序的结果如下:
需要将比较器传入集合中,修改如上代码如下:
TreeMap<Student,String> hm=new TreeMap<Student,String>(new StuNameComparable());

ass,22::shanghai
bdd,21::beijing
ccc,24::tianjing
yyy,23::wuhan

 


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------

Comparable接口