文章目录
Comparable与Comparator用法概述
Java中对集合对象或者数组对象排序,有两种方法
- 对象实现Comparable 接口
- 定义比较器,实现Comparator接口。
Comparable
1.包括实体类与实现comparable重写ComparaTo方法
写一个实体类Person
public class Person implements Comparable<Person>{ public int age; //年龄 public String name; //姓名 //get、set方法 public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Person(int age, String name) { super(); this.age = age; this.name = name; } @Override public String toString() { return "Person [age=" + age + ", name=" + name + "]"; } //实现Comparable接口必须实现compareTo方法 public int compareTo(Person o) { if(this.age==o.age&&this.name==o.name){ return 0; }else if(this.age>o.age){ System.out.println("this.age:"+this.age+"o.age:"+o.age); return 1; }else{ return -1; } } public Person() { super(); // TODO Auto-generated constructor stub } }
2.写一个测试类Test
import org.junit.Test; import junit.framework.TestCase; public class TestCompare extends TestCase { @Test public void test1(){ List<Person> list=new ArrayList<Person>(); Person test1=new Person(66,"李四"); Person test2=new Person(29,"王五"); Person test3=new Person(28,"赵六"); Person test4=new Person(20,"钱三"); list.add(test4); list.add(test3); list.add(test2); list.add(test1); Collections.sort(list); for(Object s:list){ System.out.println(s); } } }
3.运行结果:对象实现了comparable接口就自动排序
this.age:28o.age:20 this.age:29o.age:28 this.age:66o.age:29 Person [age=20, name=钱三] Person [age=28, name=赵六] Person [age=29, name=王五] Person [age=66, name=李四]
Comparator案例
1.定义一个实体类
public class emp { public int age; public String name; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public emp(int age, String name) { super(); this.age = age; this.name = name; } public emp() { super(); // TODO Auto-generated constructor stub } @Override public String toString() { return "emp [age=" + age + ", name=" + name + "]"; } }
2.编写测试类测试:
import org.junit.Test; import junit.framework.TestCase; public class TestCompare extends TestCase { @Test public void test2(){ List<emp> list=new ArrayList<emp>(); emp test1=new emp(69,"李四"); emp test2=new emp(29,"王五"); emp test3=new emp(28,"赵六"); emp test4=new emp(20,"钱三"); list.add(test4); list.add(test3); list.add(test2); list.add(test1); Collections.sort(list,new Comparator<emp>(){ @Override public int compare(emp o1, emp o2) { if(o1.age==o2.age&&o1.name==o2.name){ return 0; }else if(o1.age>o2.age){ return 1; }else{ return 0; } } }); for(Object s:list){ System.out.println(s); } } }
3.运行结果:
emp [age=20, name=钱三] emp [age=28, name=赵六] emp [age=29, name=王五] emp [age=69, name=李四]
总结
Comparable接口位于 java.lang包下,Comparator接口位于java.util包下。
Comparable: 内部比较器,一个类如果想要使用 Collections.sort(list) 方法进行排序,则需要实现该接口
Comparator: 外部比较器用于对那些没有实现Comparable接口或者对已经实现的Comparable中的排序规则不满意进行排序.无需改变类的结构,更加灵活。(策略模式)
共同点
1.都可以进行排序,都可以自定义比较规则
2.两者都是返回一个描述对象之间关系的int
不同点
1.Comparable 把自己和另一个对象进行比较Comparator 比较两个不同的对象
2.Comparator与Comparable同时存在的情况下,比较器Comparator优先级高。
3.使用Comparable需要修改原先的实体类,是属于一种自然排序,而Comparator 是不用修改原先的类的 ,Comparator实际应用广。