JavaComparator排序,Comparable与Comparator的区别
2017-04-18 18:03
302 查看
原文:
http://ctzlylc.blog.163.com/blog/static/61967136201165981283/
http://blog.csdn.net/woshixuye/article/details/22326981
Comparable是在集合内部定义的方法实现的排序,位于java.lang下。
Comparator是在集合外部实现的排序,位于java.util下。
Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。
Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
总而言之Comparable是自已完成比较,Comparator是外部程序实现比较。
②comparable和comparator综合例子
http://ctzlylc.blog.163.com/blog/static/61967136201165981283/
http://blog.csdn.net/woshixuye/article/details/22326981
概述
Comparable和Comparator都是用来实现集合中元素的比较、排序的。Comparable是在集合内部定义的方法实现的排序,位于java.lang下。
Comparator是在集合外部实现的排序,位于java.util下。
Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。
Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
总而言之Comparable是自已完成比较,Comparator是外部程序实现比较。
例子
①Comparator的绝对值比较器//实现Comparator进行测试 public class TestDemo { public static void main(String[] args) { //产生一个20个随机整数的数组 Random rnd = new Random(); Integer[] integers = new Integer[20]; for (int i = 0; i < integers.length; i++) { integers[i] = new Integer(rnd.nextInt(100)*(rnd.nextBoolean() ? 1 : -1)); } /* * check */ //用Interger内部方法排序,,默认从小到大 System.out.println("用Interger内部方法排序"); Arrays.sort(integers); //利用aslist方法排序输出 System.out.println(Arrays.asList(integers)); //用AbsComparator排序, System.out.println("用AbsComparator排序"); Arrays.sort(integers, new AbsComparator()); System.out.println(Arrays.asList(integers)); /* * 2 * --------对list等进行,以List为例 */ //创建一个List并且添加成员值. List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10; i++) { list.add(new Integer(Math.abs(rnd.nextInt(100)))); } /* * check System.out.println("check"); Iterator it = list.iterator(); while (it.hasNext()) { System.out.print(" "+it.next()); } */ //对list中的成员进行排序,从大到小排序 Collections.sort(list, new listComparator()); System.out.println("recheck"); Iterator it = list.iterator(); while (it.hasNext()) { System.out.print(" "+it.next()); } } } class AbsComparator implements Comparator { @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub int v1 = Math.abs((Integer)o1); int v2 = Math.abs((Integer)o2); return v1 > v2 ? 1 : (v1 == v2 ? 0 : -1); } } class listComparator implements Comparator { @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub int v1 = (Integer)o1; int v2 = (Integer)o2; return v1 <= v2 ? 1 : -1; } }
②comparable和comparator综合例子
//1 public class PersonTest { public static void main(String[] args) { // num, name, age Person p1 = new Person(1, "xy1", 22); Person p2 = new Person(2, "xy2", 21); System.out.println("实现Comparable接口方法结果(按年龄比较):"); System.out.println(p1.compareTo(p2)); System.out.println("实现Comparator接口方法结果(按学号比较):"); System.out.println(new PersonComparator().compare(p1, p2)); // 也可用声明一个Person[] ps,通过Array.sort(ps)进行排序, Person[] pk = new Person[2]; pk[0] = p1; pk[1] = p2; //或重写比较 Arrays.sort(pk, new ArrayComparator()); for (int i = 0; i < pk.length; i++) { System.out.println(pk[i].getNum()+" "+pk[i].getName()+" "+pk[i].getAge()); } //或Comparator 实现List排序 //输出按num从小到大的排序 List<Person> list = new ArrayList<Person>(); list.add(p1); list.add(p2); PersonComparator ps = new PersonComparator(); Collections.sort(list, ps); Iterator it = list.iterator(); while (it.hasNext()) { Person k = (Person) it.next(); System.out.println(" "+k.getNum()+" "+k.getName()+" "+k.getAge()); } } } //2 public class Person implements Comparable<Object> { private int num; private String name; private int age; public Person(int num, String name, int age) { super(); this.num = num; this.name = name; this.age = age; } @Override public int compareTo(Object o) { // TODO Auto-generated method stub return this.age - ((Person)o).getAge(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } 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; } } //3 import java.util.Comparator; public class PersonComparator implements Comparator<Object> { @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub int v1 = ((Person)o1).getNum(); int v2 = ((Person)o2).getNum(); return v1 >= v2 ? 1 : -1; } } //4 import java.util.Comparator; public class ArrayComparator implements Comparator { @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub int v1 = ((Person)o1).getNum(); int v2 = ((Person)o2).getNum(); return v1 >= v2 ? 1 : -1; } }
相关文章推荐
- Comparable与Comparator的区别
- java中comparable和 comparator的区别
- 实现comparable与comparator区别
- Comparable与Comparator的区别
- Java语言中comparable与comparator接口的区别
- Comparator and Comparable 及Collections and Collection 的区别及联系?
- Comparator与Comparable的区别
- Comparable与Comparator的区别
- java comparable和Comparator 区别
- Comparator和Comparable的区别
- 对象排序之Comparator,Comparable接口区别及应用
- Comparator and Comparable 及Collections and Collection 的区别及联系?
- Comparator和Comparable的区别使用
- Java学习札记3:Comparator和Comparable的区别
- 接口 Comparable与Comparator的区别 (Java)
- Comparable接口与Comparator接口区别
- Comparator,Comparable接口区别及应用
- java中Comparator 和 Comparable 的区别
- Comparable与Comparator的区别
- 黑马程序员_java--comparable和Comparator 的区别