转自:http://blog.csdn.net/zhangerqing

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

一、Comparator

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

接口方法:

[java] view
plain
copy

  1. /**
  2. * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
  3. */
  4. int compare(Object o1, Object o2);

例子:

[java] view
plain
copy

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. public class SampleComparator implements Comparator {
  4. public int compare(Object o1, Object o2) {
  5. return toInt(o1) - toInt(o2);
  6. }
  7. private int toInt(Object o) {
  8. String str = (String) o;
  9. str = str.replaceAll("一", "1");
  10. str = str.replaceAll("二", "2");
  11. str = str.replaceAll("三", "3");
  12. //
  13. return Integer.parseInt(str);
  14. }
  15. /**
  16. * 测试方法
  17. */
  18. public static void main(String[] args) {
  19. String[] array = new String[] { "一二", "三", "二" };
  20. Arrays.sort(array, new SampleComparator());
  21. for (int i = 0; i < array.length; i++) {
  22. System.out.println(array[i]);
  23. }
  24. }
  25. }

二、Comparable

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

接口方法:

[java] view
plain
copy

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

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

[java] view
plain
copy

  1. public class User {
  2. private String id;
  3. private int age;
  4. public User(String id, int age) {
  5. this.id = id;
  6. this.age = age;
  7. }
  8. public int getAge() {
  9. return age;
  10. }
  11. public void setAge(int age) {
  12. this.age = age;
  13. }
  14. public String getId() {
  15. return id;
  16. }
  17. public void setId(String id) {
  18. this.id = id;
  19. }
  20. }

改造后的对象:

[java] view
plain
copy

  1. import java.util.Arrays;
  2. public class User implements Comparable {
  3. private String id;
  4. private int age;
  5. public User(String id, int age) {
  6. this.id = id;
  7. this.age = age;
  8. }
  9. public int getAge() {
  10. return age;
  11. }
  12. public void setAge(int age) {
  13. this.age = age;
  14. }
  15. public String getId() {
  16. return id;
  17. }
  18. public void setId(String id) {
  19. this.id = id;
  20. }
  21. public int compareTo(Object o) {
  22. return this.age - ((User) o).getAge();
  23. }
  24. /**
  25. * 测试方法
  26. */
  27. public static void main(String[] args) {
  28. User[] users = new User[] { new User("a", 30), new User("b", 20) };
  29. Arrays.sort(users);
  30. for (int i = 0; i < users.length; i++) {
  31. User user = users[i];
  32. System.out.println(user.getId() + " " + user.getAge());
  33. }
  34. }
  35. }

三、Comparator和Comparable的区别

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

[java] view
plain
copy

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. public class UserComparator implements Comparator {
  4. public int compare(Object o1, Object o2) {
  5. return ((User) o1).getAge() - ((User) o2).getAge();
  6. }
  7. /**
  8. * 测试方法
  9. */
  10. public static void main(String[] args) {
  11. User[] users = new User[] { new User("a", 30), new User("b", 20) };
  12. Arrays.sort(users, new UserComparator());
  13. for (int i = 0; i < users.length; i++) {
  14. User user = users[i];
  15. System.out.println(user.getId() + " " + user.getAge());
  16. }
  17. }
  18. }

一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。

Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:

1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身

2、可以使用多种排序标准,比如升序、降序等

java之Comparator与Comparable的更多相关文章

  1. java的Comparator和Comparable

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

  2. Java.lang.Comparable接口和Java.util.Comparator接口的区别

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

  3. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  4. java List排序方法 Comparator和Comparable

    今天写的一个程序中需要对一个List进行排序,突然发现自己对这个问题一无所知,于是查阅资料并进行测试,在此做个记录. Collections工具类中有两个方法可以对List进行排序,分别为: publ ...

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

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt159 comparator接口与Comparable接口的区别 1. Com ...

  6. 【java】实现Interface java.lang.Comparable<T>接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<T>

    package 对象比较排序; import java.util.Arrays; class A implements Comparable<A>{ private String name ...

  7. 【java】TreeSet、Comparable、Comparator、内部类、匿名类

    package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...

  8. java lang(Comparable接口) 和java util(Comparator接口)分析比较

    //Comparable 接口强行对实现它的每个类的对象进行整体排序. -- 自然排序.类的compareTo称为自然比较方法. public interface Comparable<T> ...

  9. Java集合排序方法comparable和comparator的总结

    一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...

随机推荐

  1. nginx重新加载配置

    1.kill -HUP `cat /usr/local/nginx/logs/nginx.pid` 2./usr/local/nginx/sbin/nginx -s reload

  2. python入门第一天作业。讲师写的代码。

    #!/uer/bin/env python # _*_ coding: utf-8 _*_ import sys retry_limit = 3 retry_count = 0 account_fil ...

  3. 旧版Xcode下载地址

    怕忘记了,做个记号 https://developer.apple.com/downloads/

  4. cocos2d-x笔记4: TextField不能删除内容,以及我的解决办法。。。

    3.0正式版,win32下,TextField按下backspace键不能删除内容.网上搜了下,很早就有的问题了,正式版了竟然还不解决... 真心无力吐槽啊!!!这种巨大而又明显的Bug... 从昨天 ...

  5. POJ 2252 Dungeon Master 三维水bfs

    题目: http://poj.org/problem?id=2251 #include <stdio.h> #include <string.h> #include <q ...

  6. iphone 与 ipad -- UIPopoverPresentationViewController

    iOS8.0之后, 苹果推出了UIPopoverPresentationViewController, 在弹出控制器时, 统一采用 presentViewController, 但是要实现iPhone ...

  7. githubRepository -- 使用

    1. 注册github账号; 2. 配置SSH keys; 点击setting, 配置 SSH keys Generating SSH keys 检查本地的 SSH keys: a> 在用户目录 ...

  8. uva 11168 - Airport

    凸包+一点直线的知识: #include <cstdio> #include <cmath> #include <cstring> #include <alg ...

  9. C语言面试题(嵌入式开发方向,附答案及点评)

    整理自C语言面试题(嵌入式开发方向,附答案及点评) 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SEC ...

  10. zImage和uImage的区别

    http://blog.csdn.net/maojudong/article/details/4178118 zImage和uImage的区别 一.vmlinuz vmlinuz是可引导的.压缩的内核 ...