`

java对象比较器(排序)z

 
阅读更多
排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。
如将下列数字进行排序
1,3,5,8,3,6
于是我们得出结果
1,3,3,5,6,8
将下列字母(字符)进行排序
a,i,e,f,w,s
于是我们得出结果
a,e,f,i,s,w
但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信般简单。同一商品名称可以有不同的批次,进货时间,可能还会有单价的不同。显然只根据商品名称排序是不合理的。

再举个简单例子然后用程序实现。如公司要将员工进行排序(不要说领导排在前面),假设我们的需求比较复杂。先进行姓排序,谁的姓拼音靠前,谁就排前面。然后对名字进行排序。恩.如果同名,女性排前头。如果名字和性别都相同,年龄小的排前头。ok,一个也不算复杂的需求。

如果对java比较熟悉的会知道java.util.Comparator 接口。要实现里面的函数
int compare(Object o1, Object o2) 返回一个基本类型的整型,返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。

于是我们设计的人员类要有几个变量,firstname,lastname,sex,age分别表示姓,名,性别,年龄。

Java代码 
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 


下面是要实现比较器

Java代码 
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)); 
 
      } 
 
    }; 

 


以上代码有可能因为浏览器的布局自动换行。
compare(Person o1, Person o2)的返回值看起来比较别扭。最简单的是
Java代码 
public int compare(Boolean o1, Boolean o2) { 
 
     return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1)); 
 



o1和o2相等返回0,否则o1如果是true 就表示o1大于o2。

再尝试输出结果看看


Java代码 
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]); 
     } 
 
 

 


输出结果:

Java代码 
before sort=ouyang feng 男 27 
 
before sort=zhuang gw 男 27 
 
before sort=zhuang gw 女 27 
 
before sort=zhuang gw 女 2 
 
after sort=ouyang feng 男 27 
 
after sort=zhuang gw 女 2 
 
after sort=zhuang gw 女 27 
 
after sort=zhuang gw 男 27 

仔细理解java的Comparator会给你写排序带来很大帮助

文章来自:http://hi.baidu.com/zgz0809/blog/item/fdc65e16f1c4181b962b43e1.html
分享到:
评论

相关推荐

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    Java 中你可以凭借多态性,通过一个画圆的对象,来创建一个画椭圆或矩形的对象。不管是 画圆,画椭圆还是画矩形的方法,它们都有一个相同的方法名,但以不同的方式完成他们的 画圆的功能。 1.8 类和对象 1.8.1 ...

    Java数据库编程宝典3

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    1.4.5 Java池 21 1.4.6 流池 22 1.5 实例进程结构 23 1.5.1 SMON 24 1.5.2 PMON 24 1.5.3 DBWn 24 1.5.4 LGWR 26 1.5.5 CKPT 27 1.5.6 MMON 27 1.5.7 MMNL 28 1.5.8 MMAN 28 1.5.9 ARCn 28 1.5.10 RECO...

    达内 coreJava 习题答案

    import java.util.Scanner; class Bissextile{ public static void main(String[] arge){ System.out.print("请输入年份"); int year; //定义输入的年份名字为“year” Scanner scanner = new Scanner(System.in...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    * [a-zA-Z] a through z or A through Z, inclusive (range) [a-zA-Z] 从a 到 z 或 从A 到 Z(包括a,z,A,Z)(范围) * [a-d[m-p]] a through d, or m through p: [a-dm-p] (union) [a-d[m-p]] 从a 到...

    Java数据库编程宝典2

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    Java数据库编程宝典4

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    Java数据库编程宝典1

    1.5.1 Java数据对象 1.5.2 两层模型 1.5.3 三层模型 1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    1.4.5 Java池 21 1.4.6 流池 22 1.5 实例进程结构 23 1.5.1 SMON 24 1.5.2 PMON 24 1.5.3 DBWn 24 1.5.4 LGWR 26 1.5.5 CKPT 27 1.5.6 MMON 27 1.5.7 MMNL 28 1.5.8 MMAN 28 1.5.9 ARCn 28 1.5.10 RECO...

    Java学习笔记-个人整理的

    {13.8}java.util.Date与java.sql.Date比较}{200}{section.13.8} {13.9}Meta Data}{201}{section.13.9} {13.10}可滚动结果集}{201}{section.13.10} {13.11}Procedure}{201}{section.13.11} {14}xml}{204}{...

    cs2-lab4-wordcount-java:Loyola COMP 271实验4

    通过比较策略对排序进行参数化 迭代器,策略和适配器设计模式 使用说明 在本实验中,您将有机会完成一个工具,该工具可以计算从标准输入中读取的单词的频率。 然后,该工具以降序打印(最多)10个最常见的单词及其...

    Lab8-carolinacervantes

    通过比较策略对排序进行参数化 迭代器,策略和适配器设计模式 指示 在本实验中,您将有机会完成一个工具,该工具可以对从标准输入中读取的单词的频率进行计数。 然后,该工具以降序打印(最多)10个最常见的单词及其...

    易语言程序免安装版下载

     增加静态编译功能,支持挂接第三方链接器(比如VC6中的link.exe)。  静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理...

Global site tag (gtag.js) - Google Analytics