现在的位置: 首页 > 综合 > 正文

黑马程序员一java集合中的排序之comparable和Comparator 的区别

2018年05月23日 ⁄ 综合 ⁄ 共 1691字 ⁄ 字号 评论关闭

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

在说到java集合中排序的,我们肯定要提到comparable和Comparator,

首先他们都是接口,都是需要覆写各自对应的方法的,

只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,

所以在用到排序时,就必须根据需要,在集合外根据Comparator接口的实现类,覆写compare()方法,

并在需要调用的类中,把实现类的对象传进构造方法中。

或在集合内实现Comparable接口,在调用类上实现该接口,并覆写compartTo()方法

下面为两个小例子:

例一: Comparator是在集合外部实现

该例子定义了一个TreeSet数组,在数组中加入了一些字符串数据,并根据字符串的长度进行排序

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class GenericDemo
{
public static void main(String[] args)
{
TreeSet <String> ts=new TreeSet<String>(new LenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator<String> it =ts.iterator();
while(it.hasNext())
{
String s=it.next();
System.out.println(s);
}
}
}
class LenComparator implements Comparator<String>
{
public int  compare(String o1,String o2)
{
int num=new Integer(o1.length())
.compareTo(new Integer(o2.length()));
if(num==0)
{
return o1.compareTo(o2);
}
return num;
}


}

例二:集合内实现Comparable接口

该例子定义了一个学生,实现了Comparable接口,并在方法中根据年龄大小进行排序

但当年龄相同时,则根据学生的姓名属性进行判断

class Student_2 implements Comparable
{
private String name;
private int 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;
}
Student_2 (String name,int age)
{
this.name=name;
this.age=age;
}
public int compareTo(Object obj)
{
if(!(obj instanceof Student_2))
throw new RuntimeException("不是学生对象");
Student_2 s=(Student_2)obj;

// System.out.println(this.name+"."
// + ".compatrTo..."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
}
}

注意:两种排序都存在时,以外部比较器comparator为主

抱歉!评论已关闭.