使用 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);
}
}
}
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);
}
}
}
相关文章推荐
- Java中使用Comparable和Comparator实现字段排序功能
- java 第八篇 使用comparator实现自定义排序
- 利用反射 和 comparator 实现List 的简单排序
- 使用Java的反射简单的实现ORM框架(五)
- 使用Java中Comparator接口实现自定义排序
- 使用DOM和java反射实现简单的SpringIOC
- 快速排序的超简单实现(Java)
- JAVA 使用Comparator接口实现自定义排序
- java Comparator 实现不一样的排序
- Java简单实现几种常见排序方法
- [转]使用java简单模拟ping和telnet的实现
- java反射技术的简单使用
- Java反射之JDK动态代理实现简单AOP
- 使用JAVA实现单链表的建立、测长、打印、删除、插入、排序、逆置
- java线程池的使用与实现简单的线程池
- Java 原生实现CallBack、JUnit 单元测试简单使用
- java邮件发送的简单实现,使用javamail通过smtp协议发信
- 【Java】【反射】 使用反射方式去实现一个接口
- 使用java在本地服务器实现简单的邮件的发送与接受
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习