歡迎您光臨本站 註冊首頁

Java反射之對象通用排序

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  package test;

  import java.lang.reflect.Method;

  import java.util.ArrayList;

  import java.util.Comparator;

  import java.util.List;

  import java.util.Collections;

  public class ObjectSort {

  /**

  * @param args

  */

  public static void main(String[] args) {

  /**

  *

  * author: youjianbo

  * date:2008-6-27

  * purpose: 根據對象的某個或者某些屬性排序

  * 使用時只要將對象屬性列表和需要排序的List傳入即可

  * **/

  List arrayDemo = new ArrayList();

  Person p1 = new Person();

  p1.setName("張三");

  p1.setAge(20);

  p1.setSalary(2000);

  Person p2 = new Person();

  p2.setName("李四");

  p2.setAge(22);

  p2.setSalary(1800);

  Person p3 = new Person();

  p3.setName("王五");

  p3.setAge(25);

  p3.setSalary(1900);

  Person p4 = new Person();

  p4.setName("趙六");

  p4.setAge(25);

  p4.setSalary(3000);

  Person p5 = new Person();

  p5.setName("劉七");

  p5.setAge(30);

  p5.setSalary(2000);

  Person p6 = new Person();

  p6.setName("呂八");

  p6.setAge(25);

  p6.setSalary(2000);

  Person p7= new Person();

  p7.setName("扣九");

  p7.setAge(26);

  p7.setSalary(2000);

  Person p8= new Person();

  p8.setName("扣九哥哥");

  p8.setAge(23);

  p8.setSalary(2000);

  arrayDemo.add(p1);

  arrayDemo.add(p2);

  arrayDemo.add(p3);

  arrayDemo.add(p4);

  arrayDemo.add(p5);

  arrayDemo.add(p6);

  arrayDemo.add(p7);

  arrayDemo.add(p8);

  //*********開始比較********//

  CommonComparator comparator = new CommonComparator();

  // System.out.println("------1.按照年齡從小到大比較---------");

  // comparator.setFields_user(new String[]{"age"});

  // Collections.sort(arrayDemo, comparator);

  // for(int i=0;i<arrayDemo.size();i )

  // {

  // Person person = (Person)arrayDemo.get(i);

  // System.out.println("用戶名:" person.getName() " 年齡:" person.getAge() " 月薪:" person.getSalary());

  // }

  // System.out.println("------1.按照月薪從低到高比較---------");

  // comparator.setFields_user(new String[]{"salary"});

  // Collections.sort(arrayDemo, comparator);

  // for(int i=0;i<arrayDemo.size();i )

  // {

  // Person person = (Person)arrayDemo.get(i);

  // System.out.println("用戶名:" person.getName() " 年齡:" person.getAge() " 月薪:" person.getSalary());

  // }

  System.out.println("------1.按照年齡和月薪從低到高比較---------");

  comparator.setFields_user(new String[]{"age","salary"});

  Collections.sort(arrayDemo, comparator);

  for(int i=0;i<arrayDemo.size();i )

  {

  Person person = (Person)arrayDemo.get(i);

  System.out.println("用戶名:" person.getName() " 年齡:" person.getAge() " 月薪:" person.getSalary());

  }

  System.out.println("------1.按照月薪和年齡從低到高比較---------");

  comparator.setFields_user(new String[]{"salary","age"});

  Collections.sort(arrayDemo, comparator);

  for(int i=0;i<arrayDemo.size();i )

  {

  Person person = (Person)arrayDemo.get(i);

  System.out.println("用戶名:" person.getName() " 年齡:" person.getAge() " 月薪:" person.getSalary());

  }

  }

  }

  class CommonComparator implements Comparator

  {

  /***

  * @param

  * 比較對象的屬性用String[]的形式傳過來

  * 比較的對象一定要符合javaBean,即要有Set,Get方法

  * */

  String[] fields_user = null;

  public String[] getFields_user() {

  return fields_user;

  }

  public void setFields_user(String[] fields_user) {

  this.fields_user = fields_user;

  }

  /**

  * 定義排序規則

  * 如果按照不止一個屬性進行排序

  * 這按照屬性的順序進行排序,類是sql order by

  * 即只要比較出同位置的屬性就停止

  * */

  public int compare(Object obj1, Object obj2)

  {

  //沒有屬性,則不排序

  if(fields_user == null || fields_user.length<=0)

  {

  return 2;//不比較

  }

  for(int i=0;i<fields_user.length;i )

  {

  if(compareField(obj1,obj2,fields_user[i])>0)

  {

  //如果obj1的屬性值大於obj2的屬性值,則返回正數

  return 1;

  }else if(compareField(obj1,obj2,fields_user[i])<0)

  {

  return -1;

  }

  }

  //相等返回0

  return 0;

  }

  /**

  * @param fieldName

  * 根據屬性名排序

  * */

  private static int compareField(Object o1,Object o2,String fieldName)

  {

  try

  {

  String value1 = getFieldValueByName(fieldName,o1).toString();

  String value2 = getFieldValueByName(fieldName,o2).toString();

  if(value1.compareTo(value2)>0)

  {

  //value1大於value2

  return 1;

  }else if(value1.compareTo(value2)==0)

  {

  //相等

  return 0;

  }

  } catch (Exception e)

  {

  System.out.println("-----------------------------------------------------------------------------");

  System.out.println("---------對象的該屬性不存在或者不允許在此安全級別上反射該屬性,詳情請查閱JAVA DOC--------");

  System.out.println("-----------------------------------------------------------------------------");

  e.printStackTrace();

  }

  //小於

  return -1;

  }

  /**

  * @param

  * fieldName 屬性名

  * obj 對象

  * 反射獲得該屬性的值

  * */

  private static Object getFieldValueByName(String fieldName,Object obj)

  {

  try

  {

  String Letter = fieldName.substring(0,1).toUpperCase();

  String methodStr = "get" Letter fieldName.substring(1);

  Method method = obj.getClass().getMethod(methodStr, new Class[]{});

  Object value = method.invoke(obj, new Object[]{});

  return value;

  }catch(Exception e)

  {

  System.out.println("------------------------------------------------------");

  System.out.println("---------該" fieldName "屬性不存在----------------------");

  System.out.println("------------------------------------------------------");

  return null;

  }

  }

  }

  class Person

  {

  public Person(){}

  private String name;

  private int age;

  private long salary;

  public long getSalary() {

  return salary;

  }

  public void setSalary(long salary) {

  this.salary = salary;

  }

  public int getAge() {

  return age;

  }

  public void setAge(int age) {

  this.age = age;

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this.name = name;

  }

  }

  本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/youjianbo_han_87/archive/2008/06/27/2591584.aspx


[火星人 ] Java反射之對象通用排序已經有241次圍觀

http://coctec.com/docs/java/show-post-60590.html