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次圍觀