转自: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. PHP学习心得(五)——类型

    简介 PHP 支持8种基本的数据类型. 四种标量类型: boolean (布尔型) integer (整型) float (浮点型, 也称作 double) string (字符串) 两种复合类型: ...

  2. whoosh使用笔记

    1. whoosh安装 pip install Whoosh 2. 添加索引 第一步:生成schema 第二步:根据schema生成index.index就是一个目录中的一堆文件  (针对某个目录,调 ...

  3. 使用 windows 计划任务播放音乐文件

    这个问题网上可以搜到很多答案,但都有一些小细节没有交代,而我平时又很少使用计划任务,所以配置中出了点问题,特此备注. 1.播放器 检查当前系统下目标文件的默认播放器是什么,并且确保可以运行. 比如首次 ...

  4. gulp解决RequireJS

    gulp解决RequireJS项目前端缓存问题(二)   前言 这一节,我们主要解决在上一节<使用gulp解决RequireJSs项目前端缓存问题(一)>末尾提到的几个问题: 对通过req ...

  5. 关于django Models的个人理解和related_name的使用

    作为一个新人(刚刚大学还没有毕业就出来实习,可以说是真的什么都不知到,什么都要重新学,但是这样真的可以锻炼自己的意志力和能力).现在在公 司是前端和后端一起坐,所以要学的东西是真的多的让人想不到.在学 ...

  6. 关于BootStrap下图标的显示问题

    我现在在做自己的毕业设计,用到了bootstrap的这一套css样式,说句心里话,这一套东西确实很好用,但是一个小问题足足浪费了我将近两个小时. 我的问题是:没有办法使用bootstrap下的图标(很 ...

  7. Android之单复选框及Spinner实现二级联动

    一.基础学习 1.图形学真的很神奇啊....查了些资料做出了3D云标签,哈哈...其实直接拿来用的,我们要效仿鲁迅先生的拿来主义,嘿嘿~~3D标签云就是做一个球面,然后再球面上取均匀分布的点,把点坐标 ...

  8. Win7系统Matlab2013a安装.m文件不自动关联到MATLAB.exe解决方法

    1.在matlab命令行中输入以下代码: cwd=pwd; cd([matlabroot '\toolbox\matlab\winfun\private']); fileassoc('add',{'. ...

  9. 網站SSL加密原理簡介(2张图,握手有9个步骤,解释的很清楚)

    Secure Socket Layer說明 SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸.最早是Netscape公司所提出,SSL的目 ...

  10. while +next 循环 回到循环顶端

    my $show_tip = 1; sub login { while (1) { my $api ="https://login.weixin.qq.com/cgi-bin/mmwebwx ...