Java之Comparator和Comparable在排序中的应用

来源:互联网 发布:网络推广工作室 编辑:程序博客网 时间:2024/05/17 13:41

 Java之Comparator和Comparable在排序中的应用

当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。

一、Comparator

强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

接口方法:

 /**   * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。   */  int compare(Object o1, Object o2);
例子:
import java.util.Arrays;import java.util.Comparator;public class SampleComparator implements Comparator {  public int compare(Object o1, Object o2) {    return toInt(o1) - toInt(o2);  }  private int toInt(Object o) {    String str = (String) o;    str = str.replaceAll("一", "1");    str = str.replaceAll("二", "2");    str = str.replaceAll("三", "3");    //     return Integer.parseInt(str);  }  /**   * 测试方法   */  public static void main(String[] args) {    String[] array = new String[] { "一二", "三", "二" };    Arrays.sort(array, new SampleComparator());    for (int i = 0; i < array.length; i++) {      System.out.println(array[i]);    }  }}

二、Comparable

强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。

接口方法:

  /**   * @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。    */  int compareTo(Object o);
假设对象User,需要按年龄排序:
public class User {  private String id;  private int age;  public User(String id, int age) {    this.id = id;    this.age = age;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  public String getId() {    return id;  }  public void setId(String id) {    this.id = id;  }}
改造后的对象:
import java.util.Arrays;public class User implements Comparable {  private String id;  private int age;  public User(String id, int age) {    this.id = id;    this.age = age;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  public String getId() {    return id;  }  public void setId(String id) {    this.id = id;  }  public int compareTo(Object o) {    return this.age - ((User) o).getAge();  }  /**   * 测试方法   */  public static void main(String[] args) {    User[] users = new User[] { new User("a", 30), new User("b", 20) };    Arrays.sort(users);    for (int i = 0; i < users.length; i++) {      User user = users[i];      System.out.println(user.getId() + " " + user.getAge());    }  }}

三、Comparator和Comparable的区别

先看一下使用Comparator对User集合实现排序的方式:

import java.util.Arrays;import java.util.Comparator;public class UserComparator implements Comparator {  public int compare(Object o1, Object o2) {    return ((User) o1).getAge() - ((User) o2).getAge();  }  /**   * 测试方法   */  public static void main(String[] args) {    User[] users = new User[] { new User("a", 30), new User("b", 20) };    Arrays.sort(users, new UserComparator());    for (int i = 0; i < users.length; i++) {      User user = users[i];      System.out.println(user.getId() + " " + user.getAge());    }  }}
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等。







原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做题手感变差怎么办 吃鸡游戏掉帧怎么办 买了俄区游戏怎么办 战地1子弹用完了怎么办 1kb彩信点开了怎么办 玩地球末日卡顿怎么办 电脑显示不亮了怎么办 电脑玩游戏显卡停止运行怎么办 ie浏览器打开就停止工作怎么办 蝙蝠侠阿甘骑士卡顿怎么办 捷豹钥匙没电了怎么办 车钥匙没电 汽车报警怎么办 东西卡在门锁里怎么办 锁芯里面有东西怎么办 有东西卡在锁里怎么办 锁里面卡了牙签怎么办 塑料卡在锁里怎么办 门锁被牙签堵了怎么办 锁子里面卡东西怎么办 东西卡在锁里怎么办 开车门碰到旁边车门怎么办 美团退款后 物品怎么办 倒车影像是反的怎么办 荒野行动cp版玩着玩着关机怎么办 王者荣耀点击开始游戏就闪退怎么办 电脑遥控游玩ps4画面抖动怎么办 ps4特典不能用了怎么办 苹果x出现的分屏怎么办 电脑注册表文件丢失或损坏怎么办 cad绘图反应很慢怎么办 拍到货商家下架怎么办 电动车头太活了怎么办 快捷方式在根目录找不到了怎么办 神秘海域4卡bug了怎么办 地下城老是闪退怎么办 强制关机后电脑打不开了怎么办 文明5地中海的海军怎么办 文明5被贸易禁运怎么办 文明5海里的食物怎么办 文明5遗址没了怎么办 ⅰpad屏幕动不了怎么办