A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓斌 黑马帝   /  2011-12-17 00:27  /  3225 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李晓斌 于 2011-12-19 11:38 编辑

Comparable和Comparator接口都是用于集合比较,排序的。那这个两个接口有什么区别嘛?什么时候用Comparable接口,什么时候用Comparator接口呢?能否给出两个简单的示例?

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

7 个回复

倒序浏览
comparable&   Comparator    都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String    Integer自己就可以完成比较大小操作)   
   
   而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
刘旭 黑马帝 2011-12-17 12:47:17
藤椅
当你自定义一个类时,如果要将这个类添加到TreeSet中,就需要排序。此时,自定义的泪就要实现comparable接口,并重写其中排序的方法。
但是,假如你要将一个不是自己写的类假加入到TreeSet中,类又没有实现comparable,或者已经实现comparable接口,但是你又要按照自己定义的方法排序时,就需要自定义一个实现Comparator    接口的比较器。当两个都存在时,虚拟机按照自定义的比较器排序。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
1.Comparable接口是在java.lang类中的,而Comparator接口是在java.util类中的。
2.Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想
  实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
3.Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完
  成比较大小操作,已经实现了Comparable接口)   
4.Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你
  可以写一个比较器来完成两个对象之间大小的比较。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

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

一、Comparator

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

接口方法:


Java代码  
/**
* @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
*/  
int compare(Object o1, Object o2);  


案例:

Java代码  
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进行自动排序。

接口方法:


Java代码  
/**
* @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。  
*/  
int compareTo(Object o);  

假设对象User,需要按年龄排序:

Java代码  
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;  
  }  
  
}  

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
大梅 黑马帝 2011-12-18 19:39:35
地板
当一个自定义的类或者说是一个没有比较性的元素放进集合时,需要通过Comparable或者Comparetor使本无比较性的对象具有比较性。定义类的时候就想到了应该让类的对象具有比较性,可以选择两种接口的任意一个。
在后期使用中,需要改变比较规则(原本有比较规则)或者补充比较规则(原本无比较规则),一般用Comparetor重新定义比较规则,comparetor的比较规则可以覆盖Comparable的compareTo中定义的比较规则。
也就是说Comparetor更常用。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
徐杨 黑马帝 2011-12-18 20:15:09
7#
一,让元素自身具备比较性。
也就是元素需要实现Comparable接口,覆盖compareTo 方法。
这种方式也作为元素的自然排序,也可称为默认排序。
二,让容器自身具备比较性,自定义比较器。
需求:当元素自身不具备比较性,或者元素自身具备的比较性不是所需的。
定义一个类实现Comparator 接口,覆盖compare方法。
并将该接口的子类对象作为参数传递给TreeSet集合的构造函数。
当Comparable比较方式,及Comparator比较方式同时存在,以Comparator
比较方式为主。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
曾运 黑马帝 2011-12-19 01:01:44
8#
        在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer等Java内建类实现Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过Comparator接口来定义您自己的比较方式。
         
        Comparable接口
         在java.lang包中,Comparable接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许您把集合排序成自然顺序。
         int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值
       
        Comparator接口
         若一个类不能用于实现java.lang.Comparable,或者您不喜欢缺省的Comparable行为并想提供自己的排序顺序(可能多种排序方式),你可以实现Comparator接口,从而定义一个比较器。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马