转自: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. 使用css3实现文章新闻列表排行榜(数字)

    列举几个简单的文章排行榜数字效果 一:使用list-style来显示数字.圆点.字母或者图片 <style> li{width:300px; border-bottom: 1px dott ...

  2. 【javascript 变量和作用域】

    今天学习了javascript 的变量和作用域的基本知识,对于以前在开发中遇到的一些不懂的小问题也有了系统的认识,收获还是比较多的. [基本类型和引用类型] ECMAScript 变量可能包含两种不同 ...

  3. django查询常用操作符及models和admin的写法

    以Publisher.Author.Book的model为例子 #coding=utf-8 from django.db import models # Create your models here ...

  4. Codeforces Round #336 (Div. 1) A - Chain Reaction

    Chain Reaction 题意:有n(1 ≤ n ≤ 100 000) 个灯泡,每个灯泡有一个位置a以及向左照亮的范围b (0 <= a <= 1e6 ,1<= b <= ...

  5. nexus3添加第三方jar

    最近在看maven的打包及管理,然後就看到nexus,自己在安裝的時候就下載了最新版的nexus-3.2.0-01-win64,按照文档部署后启动,浏览.之前一致使用的是2.0的,所以还是需要导出点点 ...

  6. Java Fx-安装E(FX)CLIPSE IDE

    安装E(FX)CLIPSE IDE 本文主要介绍如何在Eclipse Mars 4.5.0版本上安装e(fx)clipse. 本文中的介绍和截图使用了纯净安装的为RCP和RAP开发者准备的Eclips ...

  7. 关于Json传递的日期/Date(数字)/解析

    在将DateTime类型的数据Json后传到前台展示,出现如下效果 ,在客户端如何解析呢?在jquery easyui 的字段中加一个格式化的函数调用.   { field: 'CreateTime' ...

  8. [DP] LCS小结

    额..失误.. LCS是Longest Common Subsequence的缩写,即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. DP.O ...

  9. Unable to Rebuild JIRA Index

    Symptoms Accessing certain JIRA pages result in: SEVERE: Internal server error com.atlassian.jira.is ...

  10. Muduo-Base-Exception(未完待续)

    Exception类 主要功能: 能够对异常信息进行输出 能够输出调用的关系 方便我们对某些信息进行调试 系统调用:#include <execinfo.h>int backtrace(v ...