/**
* Created by isu on 15-10-29.
*/
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.CollationKey;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public 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++)
{
//return compareField(obj1,obj2,fields_user[i]);
if(compareField(obj1,obj2,fields_user[i])<0)
{//如果obj1的属性值小于obj2的属性值,则返回正数
return 1;
}else if(compareField(obj1,obj2,fields_user[i])>0){
return -1;
}
}
return 0;
}
/**
* @param fieldName
* 根据属性名排序
* */
private static int compareField(Object o1,Object o2,String fieldName)
{
try
{
Object value1 = getFieldValueByName(fieldName,o1);
Object value2 = getFieldValueByName(fieldName,o2);
//--字符串比较
if(value1 instanceof String)
{
String v1 = getFieldValueByName(fieldName,o1).toString();
String v2 = getFieldValueByName(fieldName,o2).toString();
Collator myCollator = Collator.getInstance();
CollationKey[] keys = new CollationKey[5];
keys[0] = myCollator.getCollationKey(v1);
keys[1] = myCollator.getCollationKey(v2);
return (keys[0].compareTo(keys[1]));
}
//--非比较属性不比较
else if("java.lang.Boolean".equals(value1.getClass().getName()) || "java.lang.Byte".equals(value1.getClass().getName()))
{
return 0;
}else
{
BigDecimal b1 = new BigDecimal(value1.toString());
BigDecimal b2 = new BigDecimal(value2.toString());
return b1.compareTo(b2);
}
} 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;
}
}
public static void main(String[] args){
List<Bean> list = new ArrayList<Bean>();
Bean bean1 = new Bean();
bean1.setId(1);
bean1.setRate(0.0000000001234560000000d);
bean1.setScore(0.14522f);
Bean bean2 = new Bean();
bean2.setId(2);
bean2.setRate(0.223456d);
bean2.setScore(0.24522f);
Bean bean3 = new Bean();
bean3.setId(3);
bean3.setRate(0.323456d);
bean3.setScore(0.34522f);
list.add(bean1);
list.add(bean2);
list.add(bean3);
CommonComparator comparator = new CommonComparator();
comparator.setFields_user(new String[]{"score"});
Collections.sort(list, comparator);
for(Bean b:list){
System.out.println(b.getId()+":"+b.getRate()+":"+b.getScore());
}
}
}
* Created by isu on 15-10-29.
*/
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.CollationKey;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public 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++)
{
//return compareField(obj1,obj2,fields_user[i]);
if(compareField(obj1,obj2,fields_user[i])<0)
{//如果obj1的属性值小于obj2的属性值,则返回正数
return 1;
}else if(compareField(obj1,obj2,fields_user[i])>0){
return -1;
}
}
return 0;
}
/**
* @param fieldName
* 根据属性名排序
* */
private static int compareField(Object o1,Object o2,String fieldName)
{
try
{
Object value1 = getFieldValueByName(fieldName,o1);
Object value2 = getFieldValueByName(fieldName,o2);
//--字符串比较
if(value1 instanceof String)
{
String v1 = getFieldValueByName(fieldName,o1).toString();
String v2 = getFieldValueByName(fieldName,o2).toString();
Collator myCollator = Collator.getInstance();
CollationKey[] keys = new CollationKey[5];
keys[0] = myCollator.getCollationKey(v1);
keys[1] = myCollator.getCollationKey(v2);
return (keys[0].compareTo(keys[1]));
}
//--非比较属性不比较
else if("java.lang.Boolean".equals(value1.getClass().getName()) || "java.lang.Byte".equals(value1.getClass().getName()))
{
return 0;
}else
{
BigDecimal b1 = new BigDecimal(value1.toString());
BigDecimal b2 = new BigDecimal(value2.toString());
return b1.compareTo(b2);
}
} 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;
}
}
public static void main(String[] args){
List<Bean> list = new ArrayList<Bean>();
Bean bean1 = new Bean();
bean1.setId(1);
bean1.setRate(0.0000000001234560000000d);
bean1.setScore(0.14522f);
Bean bean2 = new Bean();
bean2.setId(2);
bean2.setRate(0.223456d);
bean2.setScore(0.24522f);
Bean bean3 = new Bean();
bean3.setId(3);
bean3.setRate(0.323456d);
bean3.setScore(0.34522f);
list.add(bean1);
list.add(bean2);
list.add(bean3);
CommonComparator comparator = new CommonComparator();
comparator.setFields_user(new String[]{"score"});
Collections.sort(list, comparator);
for(Bean b:list){
System.out.println(b.getId()+":"+b.getRate()+":"+b.getScore());
}
}
}