您的位置:首页 > 编程语言 > Java开发

使用 java 的反射 和 comparator 实现java bean 的简单排序

2007-06-08 10:16 1311 查看
一 , 测试bean
public class TestBean {

private String strId;
private String strName;

public String getStrId() {
return strId;
}
public void setStrId(String strId) {
this.strId = strId;
}
public String getStrName() {
return strName;
}
public void setStrName(String strName) {
this.strName = strName;
}
}

二 , 实现 Comparator 接口

import java.lang.reflect.Method;
import java.util.Comparator;
public class MyCompatrator implements Comparator {

private boolean blnSortRule;
private String strGetterNameOfSortField;
private String strBeanName;

public boolean isBlnSortRule() {
return blnSortRule;
}

public void setBlnSortRule(boolean blnSortRule) {
this.blnSortRule = blnSortRule;
}

public String getStrBeanName() {
return strBeanName;
}

public void setStrBeanName(String strBeanName) {
this.strBeanName = strBeanName;
}

public String getStrGetterNameOfSortField() {
return strGetterNameOfSortField;
}

public void setStrGetterNameOfSortField(String strGetterNameOfSortField) {
this.strGetterNameOfSortField = strGetterNameOfSortField;
}

public int compare(Object objLeft, Object objRight) {
String strMethodName = strGetterNameOfSortField;
String strValueLeft = "";
String strValueRight = "";
Method objMethod;

try {
Class clsBean = Class.forName(strBeanName);
objMethod = clsBean.getMethod(strMethodName, null);

strValueLeft = objMethod.invoke(objLeft, null).toString();
strValueRight = objMethod.invoke(objRight, null).toString();
}
catch (Exception e) {
return 0;
}
if (blnSortRule == true) {
if (strValueLeft.compareTo(strValueRight) > 0) {
return 1;
}
else {
return 0;
}
}
else {
if (strValueLeft.compareTo(strValueRight) < 0) {
return 1;
}
else {
return 0;
}
}
}
}

三 , 测试

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestSort {

public static void main(String args[]) {
List lstTestData = new ArrayList();
MyCompatrator myComparator = new MyCompatrator();

for (int intLoop = 0; intLoop < 10; intLoop++) {
TestBean testBean = new TestBean();
testBean.setStrId(String.valueOf(intLoop));
testBean.setStrName(String.valueOf(10 - intLoop));
lstTestData.add(testBean);
}

for (int intLoop = 0; intLoop < 10; intLoop++) {
TestBean testBean = (TestBean)lstTestData.get(intLoop);
System.out.println(testBean.getStrId() + " " + testBean.getStrName());
}
myComparator.setStrGetterNameOfSortField("getStrName");
myComparator.setBlnSortRule(false);
myComparator.setStrBeanName("TestBean");
Collections.sort(lstTestData, myComparator);

for (int intLoop = 0; intLoop < 10; intLoop++) {
TestBean testBean = (TestBean)lstTestData.get(intLoop);
System.out.println(testBean.getStrId() + " " + testBean.getStrName());
}
}
}

总结

实现简单排序,只对String 类型进行了排序,且未考虑bean 内字段为空的情况

补充:以上实现有个bug,compare中没有返回负数的情况,会引发排序出错情况。

修正后的比较类如下,只对部分类型的字段排序:

package com.niso.parts.common.service;

import java.lang.reflect.Field;
import java.util.Comparator;

public class BeanComparator implements Comparator {

private String strFieldName;

private boolean blnSortRule;

/**
* @return blnSortRule
*/
public boolean isBlnSortRule() {
return blnSortRule;
}

/**
*blnSortRule
*
* @param blnSortRule 要设置的 blnSortRule
*/
public void setBlnSortRule(boolean blnSortRule) {
this.blnSortRule = blnSortRule;
}

/**
* @return strFieldName
*/
public String getStrFieldName() {
return strFieldName;
}

/**
*strFieldName
*
* @param strFieldName strFieldName
*/
public void setStrFieldName(String strFieldName) {
this.strFieldName = strFieldName;
}

public int compare(Object objFrom, Object objTo) {

int intResult = 0;
try {
Field objField;
objField = objFrom.getClass().getDeclaredField(strFieldName);
objField.setAccessible(true);

if (objField.get(objFrom) == null
|| objField.get(objTo) == null) {
intResult = 0;
}
else if(objField.get(objFrom) == null
&& objField.get(objTo) != null) {
intResult = -1;
}
else if(objField.get(objFrom) != null
&& objField.get(objTo) == null) {
intResult = 1;
}
else {
String strValueFrom = String.valueOf(objField.get(objFrom).toString()) ;
String strValueTo = String.valueOf(objField.get(objTo).toString()) ;

String strType = objField.getType().toString();
String strFieldMethod = strType.substring(strType.lastIndexOf(".") + 1);

if ("Long".equals(strFieldMethod) || "long".equals(strFieldMethod)) {
intResult = Long.valueOf(strValueFrom).compareTo(Long.valueOf(strValueTo));
}
else if ("int".equals(strFieldMethod) || "Integer".equals(strFieldMethod)) {
intResult = Integer.valueOf(strValueFrom).compareTo(Integer.valueOf(strValueTo));
}
else if ("Double".equals(strFieldMethod) || "double".equals(strFieldMethod) ) {
intResult = Double.valueOf(strValueFrom).compareTo(Double.valueOf(strValueTo));
}
else if ("Short".equals(strFieldMethod) || "short".equals(strFieldMethod)) {
intResult = Short.valueOf(strValueFrom).compareTo(Short.valueOf(strValueTo));
}
else if ("String".equals(strFieldMethod) || "Date".equals(strFieldMethod)) {
intResult = String.valueOf(strValueFrom).compareTo(String.valueOf(strValueTo));
}
}
}
catch (Exception e) {
return intResult;
}

if (blnSortRule == true) {
return intResult;
}
else {
return ((-1) * intResult);
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: