1.相同点
都是java的一个接口,都是用来对自定义的class来比较大小的
什么是自定义的class:
比如定义一个Person类,里面有name,age
当我们创造一个personlist的时候,里面有很多个person1,2,3,那么我们想要对其进行自定义的排序,如按照名字或者年龄升序降序排列
怎么办?就用这两个类接口!
最后都调用:Collections.sort(...)方法进行集合的排序!
2.不同点
2.1.Comparable
直接定义在Person类上面,然后重写compareTo()
public class Person implements Comparable<Person>{ int age; String name; public Person(int age,String name){ this.age = age; this.name = name; } @Override public int compareTo(Person person) { return this.age - person.age; } }
然后在另外一个类中使用:
package dayN; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; public class ComparableTest implements Iterable{ public static void main(String[] args) { Person p1 = new Person(20,"张三"); Person p2 = new Person(19,"李三"); ArrayList arrayList = new ArrayList(); arrayList.add(p1); arrayList.add(p2); Collections.sort(arrayList); //此时调用这个Collections.sort()或者Arrays.sort(),这时候会按照我们定义的排序方式进行排序 Iterator it = arrayList.iterator(); while (it.hasNext()){ System.out.println(it.next()); } } @Override public Iterator iterator() { return null; } }
就可以得到按照年龄排序的集合
2.2.Comparator
定义在另外一个类里面
比如在Person2类里:
package dayN; public class Person2{ int age; String name; public Person2(int age,String name){ this.age = age; this.name = name; } }
只需要定义这个Person的各个属性,不需要实现Comparator接口,对于Person类是不需要实现任何变化的
而在另外一个类中实现:
package dayN; import java.util.Comparator; public class Person2Comparator implements Comparator<Person2> { @Override public int compare(Person2 o1, Person2 o2) { return o1.age - o2.age; } }
(按照年龄从小到大排列)
最后在使用的方法中,调用Collections.sort(personlist,new Person2Comparator())
package dayN; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; public class ComparatorTest implements Iterable{ public static void main(String[] args) { Person2 p1 = new Person2(18,"张三"); Person2 p2 = new Person2(19,"李三"); ArrayList arrayList = new ArrayList(); arrayList.add(p1); arrayList.add(p2); Collections.sort(arrayList,new Person2Comparator()); Iterator it = arrayList.iterator(); while (it.hasNext()){ System.out.println(it.next()); } } @Override public Iterator iterator() { return null; } }
3.拓展
有些情况可能会出现:
如果年龄相同,那么这时候怎么排序?
按照姓名或者其他属性排序!
怎么做?
我们可以先遵守年龄的升序排列,然后年龄一样时,再进行名字的升序排列
3.1.利用Comparable接口时
将compareTo(Person person)重写成这样:
package dayN; public class Person implements Comparable<Person>{ int age; String name; public Person(int age,String name){ this.age = age; this.name = name; } @Override public int compareTo(Person person) { if (this.age == person.age){ if (this.name.compareTo(person.name) > 0){ return 1; }else if (this.name.compareTo(person.name) < 0){ return -1; }else { return 0; } } return this.age - person.age; } }
3.2.Comparator接口时同理
package dayN; import java.util.Comparator; public class Person2Comparator implements Comparator<Person2> { @Override public int compare(Person2 o1, Person2 o2) { if (o1.age == o2.age){ if (o1.name.compareTo(o2.name) > 0){ return 1; }else if (o1.name.compareTo(o2.name) < 0){ return -1; }else { return 0; } } return o1.age - o2.age; } }
posted on
浙公网安备 33010602011771号