当前位置: 代码迷 >> 综合 >> java Comparable 和Comparator详解及 区别
  详细解决方案

java Comparable 和Comparator详解及 区别

热度:26   发布时间:2023-12-16 01:33:49.0

java中,对集合对象或者数组对象排序,有两种实现方式。

即:(1)对象实现Comparable 接口

        (2)定义比较器,实现Comparator接口。

下面会简要介绍这两种方法的区别,并附上实现代码,供大家参考。


Comparable介绍

Comparable是在集合内部定义的方法实现的排序,位于java.lang下。

Comparable 接口仅仅只包括一个函数,它的定义如下:

  1. package java.lang;
  2. import java.util.*;
  3. public interface Comparable<T> {
  4. public int compareTo(T o);
  5. }

若x.compareTo(y) <0,则x<y;若x.compareTo(y) =0,则x=y;若x.compareTo(y) >0,则x=y;


Comparable是一个对象,本身就已经支持自比较所需要实现的接口。

自定义类要在加入list容器中后能够排序,也可以实现Comparable接口。

在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。

若一个类实现了comparable接口,则意味着该类支持排序。如String、Integer自己就实现了Comparable接口,可完成比较大小操作

一个已经实现comparable的类的对象或数据,可以通过Collections.sort(list) 或者Arrays.sort(arr)实现排序。通过Collections.sort(list,Collections.reverseOrder());对list进行倒序排列。

Comparator介绍

Comparator是在集合外部实现的排序,位于java.util下。
Comparator接口包含了两个函数。
  1. package java.util;
  2. public interface Comparator<T> {
  3. int compare(T o1, T o2);
  4. boolean equals(Object obj);
  5. }

我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以新建一个该类的比较器来进行排序。这个比较器只需要实现comparator即可。
如果引用的为第三方jar包,这时候,没办法改变类本身,可是使用这种方式。
Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。
Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。

comparable相当于内部比较器。comparator相当于外部比较器。

comparable实例

  1. package test;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. public class test {
  6. public static void main(String[] args) {
  7. List<UserInfo> list = new ArrayList<UserInfo>();
  8. list.add( new UserInfo( 1, 21, "name1"));
  9. list.add( new UserInfo( 2, 27, "name1"));
  10. list.add( new UserInfo( 3, 15, "name1"));
  11. list.add( new UserInfo( 5, 24, "name1"));
  12. list.add( new UserInfo( 4, 24, "name1"));
  13. //对该类排序
  14. Collections.sort(list);
  15. for( int i= 0;i<list.size();i++){
  16. System.out.println(list.get(i));
  17. }
  18. }
  19. }
  20. class UserInfo implements Comparable<UserInfo>{
  21. private int userid;
  22. private int age;
  23. private String name;
  24. public UserInfo(int userid, int age, String name) {
  25. this.userid = userid;
  26. this.age = age;
  27. this.name = name;
  28. }
  29. public int getUserid() {
  30. return userid;
  31. }
  32. public void setUserid(int userid) {
  33. this.userid = userid;
  34. }
  35. public int getAge() {
  36. return age;
  37. }
  38. public void setAge(int age) {
  39. this.age = age;
  40. }
  41. public String getName() {
  42. return name;
  43. }
  44. public void setName(String name) {
  45. this.name = name;
  46. }
  47. @Override
  48. public String toString(){
  49. return this.userid+ ","+ this.age+ ","+ this.name;
  50. }
  51. @Override
  52. public int compareTo(UserInfo o) {
  53. //如果年龄相同,则比较userid,也可以直接 return this.age-o.age;
  54. if( this.age-o.age== 0){
  55. return this.userid-o.userid;
  56. } else{
  57. return this.age-o.age;
  58. }
  59. }
  60. }

comparator实例

  1. package test;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. public class test1 {
  7. public static void main(String[] args) {
  8. List<UserInfo> list = new ArrayList<UserInfo>();
  9. list.add( new UserInfo( 1, 21, "name1"));
  10. list.add( new UserInfo( 2, 27, "name2"));
  11. list.add( new UserInfo( 3, 15, "name3"));
  12. list.add( new UserInfo( 5, 24, "name4"));
  13. list.add( new UserInfo( 4, 24, "name5"));
  14. //new一个比较器
  15. MyComparator comparator = new MyComparator();
  16. //对list排序
  17. Collections.sort(list,comparator);
  18. for( int i= 0;i<list.size();i++){
  19. System.out.println(list.get(i));
  20. }
  21. }
  22. }
  23. class MyComparator implements Comparator<UserInfo>{
  24. @Override
  25. public int compare(UserInfo o1,UserInfo o2) {
  26. if(o1.getAge()-o2.getAge()== 0){
  27. return o1.getUserid()-o2.getUserid();
  28. } else{
  29. return o1.getAge()-o2.getAge();
  30. }
  31. }
  32. }
  33. class UserInfo{
  34. private int userid;
  35. private int age;
  36. private String name;
  37. public UserInfo(int userid, int age, String name) {
  38. this.userid = userid;
  39. this.age = age;
  40. this.name = name;
  41. }
  42. public int getUserid() {
  43. return userid;
  44. }
  45. public void setUserid(int userid) {
  46. this.userid = userid;
  47. }
  48. public int getAge() {
  49. return age;
  50. }
  51. public void setAge(int age) {
  52. this.age = age;
  53. }
  54. public String getName() {
  55. return name;
  56. }
  57. public void setName(String name) {
  58. this.name = name;
  59. }
  60. @Override
  61. public String toString(){
  62. return this.userid+ ","+ this.age+ ","+ this.name;
  63. }
  64. }

  相关解决方案