`
YOUNG918
  • 浏览: 184947 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java comparable 和 comparator 排序

    博客分类:
  • java
阅读更多
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序

Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)

而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
    comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式  
   comparable应该比较固定,和一个具体类相绑定,而comparator比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
  一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。
  而Comparator的作用有两个:
  1. 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序
  2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序
用法:
实现comparable类的实例就是可以排序的,重写compareTo(),只要调用sort(Object[] a)方法就可以,如果没有实现comparable接口,却调用sort(Object[] a)方法就会报错,因为sort()里面用到的mergeSort()方法将a转化成Comparable类型调用compareTo(T o)方法。
例子:
一。实现comparable接口
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接口

public class Person {
String firstname,lastname;
Boolean sex;
Integer age;
public Person(String firstname,String lastname,Boolean sex,Integer age) {
    this.firstname = firstname;
    this.lastname = lastname;
    this.sex = sex;
    this.age = age;
}
public String getFirstName() {
     return firstname;
   }

   public String getLastName() {
     return lastname;
   }
   public Boolean getSex() {
      return sex;
    }

    public Integer getAge() {
      return age;
    }

//为了输入方便,重写了toString()

public String toString()
    {
      return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age;
    }
}
//end person


下面是要实现比较器
public class Comparators {
public static java.util.Comparator getComparator() {
    return new java.util.Comparator() {

      public int compare(Object o1, Object o2) {
        if (o1 instanceof String) {
          return compare( (String) o1, (String) o2);
        }
       else if (o1 instanceof Integer) {
          return compare( (Integer) o1, (Integer) o2);
        }

       else if (o1 instanceof Person) {
      return compare( (Person) o1, (Person) o2);
    }

        else {
          System.err.println("未找到合适的比较器");
          return 1;

        }
      }

      public int compare(String o1, String o2) {
        String s1 = (String) o1;
        String s2 = (String) o2;
        int len1 = s1.length();
        int len2 = s2.length();
        int n = Math.min(len1, len2);
        char v1[] = s1.toCharArray();
        char v2[] = s2.toCharArray();
        int pos = 0;

        while (n-- != 0) {
          char c1 = v1[pos];
          char c2 = v2[pos];
          if (c1 != c2) {
            return c1 - c2;
          }
          pos++;
        }
        return len1 - len2;
      }

      public int compare(Integer o1, Integer o2) {
        int val1 = o1.intValue();
        int val2 = o2.intValue();
        return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));

      }
      public int compare(Boolean o1, Boolean o2) {

         return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));

       }

      public int compare(Person o1, Person o2) {
        String firstname1 = o1.getFirstName();
        String firstname2 = o2.getFirstName();
        String lastname1 = o1.getLastName();
        String lastname2 = o2.getLastName();
        Boolean sex1 = o1.getSex();
        Boolean sex2 = o2.getSex();
        Integer age1 = o1.getAge();
        Integer age2 = o2.getAge();
        return (compare(firstname1, firstname2) == 0 ?
                (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 :
                 compare(age1, age2)) :
                 compare(sex1, sex2)) :
                 compare(lastname1, lastname2)) :
                compare(firstname1, firstname2));

      }

    };
}

}



//测试

public class Main {
public Main() {
}
public static void main(String[] args) {
    Person[] person = new Person[] {
         new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),
         new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
         new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),
         new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2))
     };
     for (int i = 0; i < person.length; i++) {
       System.out.println("before sort=" + person[i]);
     }
     java.util.Arrays.sort(person, Comparators.getComparator());
    for (int i = 0; i < person.length; i++) {
      System.out.println("after sort=" + person[i]);
    }

}

}


另一个从网上摘的例子:
1,comparator
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]);   
    }   
  }   
  
}
 

2,comparable

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());   
    }   
  }   
  
}  



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());   
    }   
  }   
  
}  


http://hi.baidu.com/kinny/blog/item/4b3eba7e93c453380cd7da16.html 摘的一段:
1.对象本身实现Comparable接口,那么该类的实例就是可以排序的.
有关Comparable: http://blog.csdn.net/treeroot/archive/2004/09/09/99613.aspx
只要实现了Comparable接口,就可以调用Collections的sort方法对集合中的元素排序.

2.指定一个Comparator,也就是实现了Comparator的类的一个实例.
但是Java本身只提供了一个Comparator的实现,就是Collections.reverseOrder().
该方法返回的是一个已经实现了Comparable接口的反序.

看一下Comparator的全部内容:

public interface Comparator {
  int compare(Object o1, Object o2);
  boolean equals(Object obj);
}
定义了两个方法,其实我们一般都只需要实现compare方法就行了,因为类都是默认从Object继承
所以会使用Object的equals方法.
Comparator一般都作为一个匿名类出现,对于没有实现Comparable的对象的集合,排序的时候
需要指定一个Comparator.
分享到:
评论

相关推荐

    java排序Comparator和Comparable

    java排序Comparator和Comparable

    Java Comparable 和 Comparator 的详解及区别

    主要介绍了Java Comparable 和 Comparator 的详解及区别的相关资料,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中的Comparable排序接口和Comparator比较器接口

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

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

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

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

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

    Comparable接口和Comparator接口的比较

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

    java Lucene 中自定义排序的实现

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

    Java 集合方面的面试题

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

    Java基础知识点.html

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

    java集合类演示源码

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

    ComparaTest.rar

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

    ArraySort排序

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

    Java数据结构--13.Java8数据结构TreeSet.pdf

    * 元素由它们的⾃然 Comparable 排序,或者通过⼀个由顺序 set 创建时特别提供的 * Comparator。这个 set 的迭代器将会以递增元素顺序横穿 set。提供多个额外的操作来⽀持排 * 序。(这个接⼝与 SortedMap 的 set ...

    Java开发详解.zip

    031113_【第11章:Java常用类库】_比较器(Comparable、Comparator)笔记.pdf 031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java...

    AIC的Java课程1-6章

     知道实现比较器(Comparable,Comparator)用于排序算法(多态性)。  [*]了解同步包装和不可修改包装。 第12章 IO与串行化 2课时  了解Java IO 中类的层次结构,介绍Java IO采用的装饰...

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

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

    java常用工具类的使用

    在Java程序设计过程中,对应日期和时间的格式化,还有一个简单的格式化方式,就是java.text.SimpleDateFormat,该类中用字符串指定日期和时间的格式,字符串中的字符称为模式字符,模式字符区分大小写。常见的模式...

    Java服务器端开发面试.doc

    何时栈上创建,传递变量时候的按值传 递 Comparable 接口,Comparator类,用来做比较,主要是用于集合中,排序,插入等等 类初始化,变量初始化,静态变量,静态区,常量区等等 继承多态需要知道的有super, this, ...

    Java学习路线:day21

    文章目录第9章Java常用类IDEA中Debug调试JDK 8之前的日期时间API(`...与传统日期处理的转换Java比较器概述Comparable自然排序举例自定义类实现Comparable自然排序使用Comparator实现定制排序System类、Math类、BigInte

Global site tag (gtag.js) - Google Analytics