`

Comparator和Comparable在排序中 区别

    博客分类:
  • java
 
阅读更多
当需要排序的集合或数组不是单纯的数字类型的时候,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
Comparator和Comparable的区别如下:
Comparable用在对象本身,说明这个对象是可以被比较的,也就是说可以被排序的。(String和Integer之所以可以比较大小,是因为它们都实现了Comparable接口,并实现了compareTo()方法)。
Comparator用在对象外面,相当于定义了一套排序算法来排序

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等

http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html

当需要排序的集合或数组不是单纯的数字型时,通常可以使用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());
    }
  }

}
分享到:
评论

相关推荐

    java排序Comparator和Comparable

    java排序Comparator和Comparable

    Compable和Comparator自定义对象属性排序

    可以通过两种方式自定义对象的属性大小进行比较,对一个list或数组对根据属性排序一个list或数组

    对比Java中的Comparable排序接口和Comparator比较器接口

    Comparable和Comparator接口都可用作普通意义上对象间的比大小,但两个接口在实例化方面的用法不尽相同,接下来我们就来详细对比Java中的Comparable排序接口和Comparator比较器接口

    JAVA集合的使用(List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类、equals、hashCode)

    要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode

    Java中Comparator接口与Comparable接口的区别

    1. Comparator 和 Comparable 相同的地方  他们都是java的一个接口, 并且是用来对自定义的class比较大小的,  什么是自定义class: 如 public class Person{ String name; int age }.  当我们有这么一个...

    Java Comparable 和 Comparator 的详解及区别

    主要介绍了Java Comparable 和 Comparator 的详解及区别的相关资料,Comparable 自然排序和Comparator 定制排序的实例,需要的朋友可以参考下

    Comparable接口和Comparator接口的比较

    Comparable是 排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。 此外,实现此接口的对象可以用作...

    Android ComparableDemo

    Comparable和Comparator都是用来实现集合中元素的比较、排序的。 Comparable是在集合内部定义的方法实现的排序,而Comparator是在集合外部实现的排序,如果想实现排序,就需要在集合外定义Comparator接口的方法或在...

    Android ComparatorDemo

    Comparable和Comparator都是用来实现集合中元素的比较、排序的。 Comparable是在集合内部定义的方法实现的排序,而Comparator是在集合外部实现的排序,如果想实现排序,就需要在集合外定义Comparator接口的方法或在...

    java Lucene 中自定义排序的实现

    Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和ScoreDocComparator接口.在...

    Java 集合方面的面试题

    什么是 Comparable 和 Comparator 接口?它们有什么区别? 如何使用 ConcurrentHashMap 类来实现线程安全的映射? 如何避免在多线程环境下对同一集合的并发修改? 如何使用 PriorityQueue 类实现一个最小堆? 如何...

    ArraySort排序

    ArraySort java数组排序的两种方法:实现Comparator接口,重写compare方法 2实现Comparable接口

    ComparaTest.rar

    用Java的Comparable接口与Comparator接口分别实现类的比较排序~~

    Java学习路线:day21

    `)SimpleDateFormat的使用SimpleDateFormat的练习Calendar日历类的使用JDK8中日期时间API的介绍LocalDate、LocalTime、LocalDateTime的使用Instant类的使用DateTimeFormatter的使用其它日期时间相关API的使用参考:...

    CSC212Sorting:排序(但主要是MergeSort)

    尽管我们在课堂上讨论了Comparable和Comparator,但此处的排序算法仅需要对ListADT&lt;Integer&gt; ,就像提供的bubbleSort一样。没有提供签名。您将必须决定排序算法是修改列表(在BubbleSort中很容易)还是返回新列表...

    Java基础知识点.html

    哈希值 LinkedHashSet TreeSet 自然排序Comparable 比较器排序Comparator Set集合 并发修改异常 LinkedList集合 ArrayList集合 List集合 Collection集合概述 冒泡排序 Object 异常 Math 包装类 Calendar类 ...

    java集合类演示源码

    实现Comparable接口或Comparator接口,用户可以根据需要对集合中的元素进行排序。为了方便用户使用,Java平台还提供了Collections和Arrays工具类。collection.rar分别对上述内容进行详细讲解演示。

    实现元素比较1

    1. ==、equals、compareTo的关系 3. Comparable接口自然排序 4. comparator定制排序 5. 重写equals方法的标准

    java实现别踩白块儿源码-SortedList:用Java编写的SortedList的实现。可以与实现Comparable接口的对象一起使用

    它是使用Comparator对象构造的,该对象可以将两个对象进行比较,从而使SortedList可以将其元素按升序或降序排序。 当且仅当要使用的对象实现Comparable接口时,我们也可以创建不带Comparator对象的SortedList。 用法...

    11集合.rarjava 集合类

    java 集合类的排序主要是用Collections.sort方法,Collections和Collection是不一样的,前者是类,后者是接口,在这里,我主要是想说明它的sort方法的几种类型, 提示:实现接口的方法时,只需要比较两个数,大的返回1,...

Global site tag (gtag.js) - Google Analytics