`
youjianbo_han_87
  • 浏览: 18252 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 对象多属性通用排序方法(使用反射)

    博客分类:
  • java
阅读更多
不说别的,直接发代码,哎
java web 开发很有用

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);

arrayDemo.add(p1);
arrayDemo.add(p2);
arrayDemo.add(p3);
arrayDemo.add(p4);
arrayDemo.add(p5);

//*********开始比较********//
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]))
{
//如果obj1的属性值大于obj2的属性值,则返回正数
return 1;
}else
{
//小于返回负数
return -1;
}
}
//相等返回0
return 0;
}
/**
* @param fieldName
* 根据属性名排序
* */
private static boolean 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)
{
return true;
}
} catch (Exception e)
{
System.out.println("-----------------------------------------------------------------------------");
System.out.println("---------对象的该属性不存在或者不允许在此安全级别上反射该属性,详情请查阅JAVA DOC--------");
System.out.println("-----------------------------------------------------------------------------");
e.printStackTrace();
}
return false;
}
/**
* @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;
}
}
3
5
分享到:
评论
10 楼 youjianbo_han_87 2009-11-02  
http://blog.csdn.net/youjianbo_han_87/archive/2008/06/27/2591584.aspx

正确的文章
9 楼 youjianbo_han_87 2009-11-02  
不好意思,对不起观众,正确的文章在 CSDN上,这个是初稿,代码不是照搬的,是自己写的哟。
8 楼 sabin541 2009-01-19  
呵呵,都不对,你自己还顶呢?而且用的是反射机制,新人大概很少有懂反射机制的。实现
Comparator接口时候方法套方法倒是表现的挺专业的。大概也是照搬的吧。
7 楼 sabin541 2009-01-19  
厉害了!接触反射太少了,要是原创的话你的功力不浅了啊。
6 楼 mht19840918 2008-11-02  
呵呵,借鉴下,幸苦了
5 楼 llm6101 2008-07-04  
月薪同为2000的4个人,却没有按照年龄再排
4 楼 llm6101 2008-07-04  
public static void main(String[] args) {
		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);

		arrayDemo.add(p1);
		arrayDemo.add(p2);
		arrayDemo.add(p3);
		arrayDemo.add(p4);
		arrayDemo.add(p5);
		arrayDemo.add(p6);
		arrayDemo.add(p7);

    CommonComparator comparator = new CommonComparator();

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());
		}
	}



出来的结果是


------1.按照月薪和年龄从低到高比较---------
用户名:李四 年龄:22 月薪:1800
用户名:王五 年龄:25 月薪:1900
用户名:张三 年龄:20 月薪:2000
用户名:刘七 年龄:30 月薪:2000
用户名:呂八 年龄:25 月薪:2000
用户名:扣九 年龄:26 月薪:2000
用户名:赵六 年龄:25 月薪:3000


这明显不对嘛.....
3 楼 gaozhonghui 2008-06-27  
初学Java  感觉挺好!
2 楼 malk 2008-06-27  
为什么不用TreeSet
1 楼 youjianbo_han_87 2008-06-27  
自己先顶下

相关推荐

    Java练习算法代码(排序,数据结构,小算法练习题).zip

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...

    Java 排序算法知识点总结.zip

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...

    通用工具类

    8.利用反射机制进行排序工具类,支持数组、List、Set、Map的排序,可以支持多属性排序,支持子对象中的属性排序(例user对象中的role的name属性进行排序,method="role.name") 9.JVM参数获取工具 10.Java对象比较、...

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    用Java实现基础数据结构,排序算法、经典算法以及leetcode刷题记录.zip

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...

    Java2核心技术.part5

    5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2接口与抽象类 6.2对象克隆 6.3接口与回调 6.4内部类 6.4.1...

    JAVA_Thinking in Java

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    史上最全经典排序算法总结(Java实现).zip

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...

    Thinking in Java简体中文(全)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    JAVA面试题最全集

    IS09000和CMM(软件能力成熟度模型)认证是国际上通用的软件质量评估方法.CMM的五个成熟度等级。 第一,谈谈final, finally, finalize的区别。 final?修饰符(关键字)如果一个类被声明为final,意味着它不能再...

    Thinking in Java 中文第四版+习题答案

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 其他J/Direct...

    Java开发技术大全 电子版

    14.3.3AWT组件通用属性与方法448 14.3.4使用AWT编制GUI程序示例449 14.4事件处理452 14.4.1授权事件模型452 14.4.2事件453 14.4.3事件源453 14.4.4事件监听器和适配器454 14.4.5编写事件处理程序的基本方法...

    算法实践(JavaScript &amp; Java),排序,查找、树、两指针、动态规划等.zip

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行(Write Once, Run Anywhere)”,这意味着开发者可以使用Java编写应用程序,并在支持...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    9.1.6 排序收集的对象 276 9.1.7 使用泛型 280 9.2 键值对应的map 284 9.2.1 常用map操作类 284 9.2.2 访问map键值 288 9.3 重点复习 291 9.4 课后练习 292 chapter10 输入输出 299 10.1 ...

    Java2核心技术.part3

    5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2接口与抽象类 6.2对象克隆 6.3接口与回调 6.4内部类 6.4.1...

    Java2核心技术.part1

    5.5.4使用反射编写通用的数组代码 5.5.5方法指针 5.6枚举类 5.7继承设计技巧 第6章接口与内部类 6.1接口 6.1.1接口的特性 6.1.2接口与抽象类 6.2对象克隆 6.3接口与回调 6.4内部类 6.4.1使用内部类...

Global site tag (gtag.js) - Google Analytics