【一】Comparable,Comparator
1.Comparable是一个内在比较器。只要事先Comparable接口的对象直接就成为一个可以比较的对象。——compareTo
2.Comparator是一个外在比较器。——compare方法
Comparator优点:a.个性化比较:如果实现类没有实现Comparable接口,但又想对两个类进行比较(或实现Comparable接口,但不满意其中的比较方法),那么实现Comparator接口,自定义一个比较器。b.解耦:如果要修改比较算法,要修改Comparable接口的实现类,而实现Comparator的类,是在外部比较的,不需要修改实现类。
Comparable接口 举例:
【需求】:按照学生的年龄进行排序
【代码实现】:
import java.util.*;
class ComparableDemo
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet();
ts.add(new Student("lisi01",20));
ts.add(new Student("lisi02",20));
ts.add(new Student("lisi03",22));
ts.add(new Student("lisi04",21));
ts.add(new Student("lisi05",24));
ts.add(new Student("lisi01",20));
System.out.println(ts);
//[Student@4e25154f, Student@70dea4e, Student@5c647e05, Student@33909752, Student@55f96302]
Iterator it=ts.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s.getName()+"......"+s.getAge());
/*
lisi01......20
lisi02......20
lisi04......21
lisi03......22
lisi05......24
*/
}
}
}
class Student implements Comparable
{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
//比较
public int compareTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException("不是学生类对象");
Student s=(Student)obj;
if(this.age>s.age){
return 1;
}
if(this.age==s.age){
return this.name.compareTo(s.name);
}
return -1 ;
}
}
【输出】:
Comparator接口 举例:
【需求】:按照集合元素的长短排序
【代码实现】:
import java.util.*;
class ComparatorDemo2
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet(new strLenComparator());
ts.add("abc");
ts.add("我爱学习");
ts.add("我是优秀好青年");
ts.add("我为什么爱学习");
ts.add("因为爱情");
ts.add("我爱学习");
ts.add("我爱学习");
Iterator it=ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
/*
abc
因为爱情
我爱学习
我为什么爱学习
我是优秀好青年
*/
}
}
}
class strLenComparator implements Comparator
{
public int compare(Object o1,Object o2){
String s1=(String)o1;
String s2=(String)o2;
int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num==0)
return s1.compareTo(s2);
return num;
}
}
【输出】:
当两种排序比较器都存在时, 以Comparator为主。
Comparable接口 举例:
【需求】:按照学生的年龄进行排序
【代码实现】:
import java.util.*;
class ComparatorDemo
{
public static void main(String[] args)
{
TreeSet ts=new TreeSet(new MyComparator());
ts.add(new Student("lisi01",20));
ts.add(new Student("lisi02",20));
ts.add(new Student("lisi03",22));
ts.add(new Student("lisi04",21));
ts.add(new Student("lisi05",24));
ts.add(new Student("lisi01",20));
Iterator it=ts.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s.getName()+"......"+s.getAge());
/*
lisi01......20
lisi02......20
lisi03......22
lisi04......21
lisi05......24
*/
}
}
}
class Student implements Comparable
{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
//比较
public int compareTo(Object obj){
if(!(obj instanceof Student))
throw new RuntimeException("不是学生类对象");
Student s=(Student)obj;
if(this.age>s.age){
return 1;
}
if(this.age==s.age){
return this.name.compareTo(s.name);
}
return -1 ;
}
}
class MyComparator implements Comparator
{
public int compare(Object obj1,Object obj2){
Student stu1=(Student)obj1;
Student stu2=(Student)obj2;
int num=stu1.getName().compareTo(stu2.getName());
if(num==0)
return stu1.getAge()-stu2.getAge();
return num;
}
}
【输出】: