1. 程式人生 > >JAVA 利用Comparator實現自定義排序

JAVA 利用Comparator實現自定義排序

/*

有個Person類,包括姓、名、性別、年齡屬性:現在有個需求,需要對Person進行以下規則的排序
 * 誰的姓拼音靠前,誰就排前面。
 * 然後對名字進行排序。如果同名,女性排前頭。
 * 如果名字和性別都相同,年齡小的排前頭。
 *
int compare(Object o1, Object o2) 返回一個基本型別的整型
如果要按照升序排序,
則o1 小於o2,返回-1(負數),相等返回0,01大於02返回1(正數)
如果要按照降序排序
 則o1 小於o2,返回1(正數),相等返回0,01大於02返回-1(負數)


 */

Person類

package com.ibm.test;

public class Person {
 String firstname,lastname;  
 char sex;  
 Integer age;
 
 public Person(String firstname, String lastname, char sex, Integer age) {

  this.firstname = firstname;
  this.lastname = lastname;
  this.sex = sex;
  this.age = age;
 }
 public Integer getAge() {
  return age;
 }
 public void setAge(Integer age) {
  this.age = age;
 }
 public String getFirstname() {
  return firstname;
 }
 public void setFirstname(String firstname) {
  this.firstname = firstname;
 }
 public String getLastname() {
  return lastname;
 }
 public void setLastname(String lastname) {
  this.lastname = lastname;
 }
 public char getSex() {
  return sex;
 }
 public void setSex(char sex) {
  this.sex = sex;
 } 
 
 
}

Comparators 類:

package com.ibm.test;

/*
 * 誰的姓拼音靠前,誰就排前面。
 * 然後對名字進行排序。如果同名,女性排前頭。
 * 如果名字和性別都相同,年齡小的排前頭。
 *
int compare(Object o1, Object o2) 返回一個基本型別的整型
如果要按照升序排序,
則o1 小於o2,返回-1(負數),相等返回0,01大於02返回1(正數)
如果要按照降序排序
 則o1 小於o2,返回1(正數),相等返回0,01大於02返回-1(負數)


 */
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;  
     /*
      * System.out.println("s1=="+s1+"                s2=="+s2);
      * 取出陣列相鄰的兩個姓firstname或者名lastname
      */ 
        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();  
       
        /*
         * System.out.println("val1=="+val1+"                val2=="+val2);
         * 取出陣列相鄰的兩個人的年齡age
         */ 
        return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));  
 
      }  
      public int compare(char o1, char o2) { 
       /*
           * System.out.println("o1=="+o1+"                o2=="+o2);
           * 取出陣列相鄰的兩個人的性別
           * 對return的邏輯解釋:
           *
           比如兩個人的性別分別是男和女,當第一個人的性別是‘男’,則返回1
           (返回1的對於compare方法來說,即認為o1(男)>(女)o2,而o1>o2返回1則按照升序排序,升序排序即將小的(女)排在前面 )
          
           還不懂的話:接著看compare方法的解釋
           int compare(Object o1, Object o2) 返回一個基本型別的整型
            如果要按照升序排序,
            則o1 小於o2,返回-1(負數),相等返回0,01大於02返回1(正數)
            如果要按照降序排序
            則o1 小於o2,返回1(正數),相等返回0,01大於02返回-1(負數)

           */
      
       return ((o1==o2)? 0 : (o1=='男'?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();  
        char sex1 = o1.getSex();  
        char sex2 = o2.getSex();  
        Integer age1 = o1.getAge();  
        Integer age2 = o2.getAge();  
        /*return 邏輯解釋如下:
         * 誰的姓拼音firstname靠前,誰就排前面。
         * 然後對名字lastname進行排序。如果同名,
         * 女性sex==false排前頭。(sex的值true表示男性,false表示女性)
         * 如果名字和性別都相同,age年齡小的排前頭。
         */
        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));  
 
      }  
 
    };  
}  
 

Main方法

package com.ibm.test;

import java.util.Arrays;

/*
 * 誰的姓拼音靠前,誰就排前面。
 * 然後對名字進行排序。如果同名,女性排前頭。
 * 如果名字和性別都相同,年齡小的排前頭。
 *


 */
public class Main {  
 public Main() {  
 }  
 public static void main(String[] args) {  
     Person[] person = new Person[] {  
          new Person("ouyang", "feng", '男', new Integer(27)),  
          new Person("zhuang", "gw", '男', new Integer(27)),  
          new Person("deng", "jx", '男', new Integer(28)),  
          new Person("deng", "jx", '女', new Integer(27)),  
  
  
      };
    
      for (int i = 0; i < person.length; i++) {  
        System.out.println("排序前=" + person[i].getFirstname()+"  "+person[i].getLastname()+"  "+person[i].getAge()+"  "+person[i].getSex());  
      }  
      /*
       * 根據sort方法的第一個引數是person,然後在Comparators.getComparator()方法中找到對應的方法
       * compare(Person o1, Person o2),引數與person型別一致
       */
      java.util.Arrays.sort(person, Comparators.getComparator());  
     
      System.out.println("————————————————————————————————————————————————————————————————————————");
      for (int i = 0; i < person.length; i++) {  
          System.out.println("排序後=" + person[i].getFirstname()+"  "+person[i].getLastname()+"  "+person[i].getAge()+"  "+person[i].getSex());  
            }  
      System.out.println("————————————————————————————————————————————————————————————————————————");
   
      Integer[] data = new Integer[]{2,3,1};
     
      for (int i = 0; i < data.length; i++) {  
         System.out.println("排序前=" + data[i]+"  ");  
       }
      Arrays.sort(data,Comparators.getComparator());
      System.out.println("————————————————————————————————————————————————————————————————————————");
   
      for (int i = 0; i < data.length; i++) {  
         System.out.println("排序後=" + data[i]+"  ");  
       }
  
 }  
  
 } 

  執行效果: