`
youjianbo_han_87
  • 浏览: 18607 次
  • 性别: 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中List对象排序通用方法

    关键在于,`SortList`类的`Sort()`方法内部创建了一个Comparator,它使用反射机制动态获取对象的指定属性(由`method`参数指定)。首先,通过`getMethod()`方法获取对象类上的指定方法,然后通过`invoke()`方法调用...

    List对象排序通用方法

    ### List对象排序通用方法 #### 一、背景与需求 在进行软件开发的过程中,经常会遇到从数据库中查询出一系列的数据并存储为`List`对象的情况。这些数据在后续的处理中可能需要根据不同的字段进行排序。传统的做法...

    java中list排序

    在 Java 中,对 List 排序可以使用 Collections.sort(list) 方法,但是这种方法只能对基本类型的 List 进行排序,如果 List 中包含的是对象,那么这种方法就不行了。这时需要使用Comparator接口来实现排序。 ...

    List 对象属性排序

    - 使用反射获取对象属性的方法`getMethod()`,并调用`invoke()`执行方法获取属性值。 - 根据指定的排序方式调整比较顺序。 - 如果属性类型为字符串,则使用`String.compareTo()`方法进行比较;如果属性为其他类型...

    List对象排序通用方法[参考].pdf

    这里我们将探讨如何对包含自定义对象的`List`进行通用排序,并减少冗余代码。 首先,Java的`Collections.sort()`方法是用于对`List`进行排序的便捷工具,但默认它只能处理实现了`Comparable`接口的元素。对于自定义...

    Java对象交换方法剖析.pdf

    最后,文章强调了这种基于Java反射机制的对象交换方法对于需要利用对象交换的Java算法实现具有借鉴意义,例如快速排序算法中就需要用到对象交换方法来交换数组元素的值。这种方法的设计和实现对于Java开发者而言是一...

    Java对List对象进行排序_.docx

    这里介绍的是一种利用Java反射机制实现的通用排序方法。 首先,反射机制允许我们在运行时获取类的信息,包括类的字段(成员变量)和方法。通过`Class.getDeclaredField()`方法,我们可以获取到指定名称的字段。由于...

    java注解、java反射机制 jdbc 封装

    例如,你可以使用反射来获取类的字段信息,然后动态生成对应的SET和WHERE子句,以此实现通用的CRUD(Create、Read、Update、Delete)操作。 JDBC是Java连接数据库的标准API,提供了与各种数据库交互的能力。通过...

    java通用API工具合集,最全中文版

    Java通用API工具合集是Java开发者的重要参考资料,它包含了Java平台标准版(Java SE)的各种类库和接口的详尽文档。这个最全中文版使得中国开发者能够更方便地理解和使用Java API,避免了语言障碍,提高了开发效率。...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第13章_Java反射机制(共44页).rar

    7. **Java集合框架的通用操作**:例如`java.util.Collections`中的`sort()`方法,它接受`List`接口,通过反射找到比较器或实现自然排序。 Java反射主要涉及以下几个关键类: 1. **Class类**:每个类在运行时都有一...

    Java中的万能查询方法(源码)

    在Java编程中,"万能查询方法"是一种通用的、基于反射技术实现的数据库查询解决方案。这种方法的主要目的是简化代码,减少重复性工作,提高代码的复用性。它允许开发者通过传入实体类和SQL查询语句来执行数据库查询...

    2014年Java最全面试题以及答案.

    通过反射机制,可以使用Class对象的getMethod方法来获取方法对象,然后使用invoke方法调用该方法。 22. 如何将数值型字符转换为数字? 可以使用Character类的getNumericValue方法或者通过包装类(如Integer....

    java面试真题通用题目8卷

    这八卷通用面试题集合了Java的基础知识、进阶特性、并发处理、内存管理、集合框架、多线程、异常处理、设计模式等多个方面的内容。以下是这些知识点的详细解析: 1. **Java基础**:包括语法基础如类、对象、封装、...

    Effective Java第三版1

    ### 第三章 对所有对象都通用的方法 这部分主要关注Java中的基本对象行为: 1. **equals方法**:正确覆写`equals`以满足等价关系,同时要遵循一致性和传递性原则。 2. **hashCode方法**:当覆写`equals`时,必须同时...

    [程序员实习日记大全]java程序员实习日记多篇.docx

    【程序员实习日记】系列文档记录了一个Java程序员在实习过程中的学习和成长,主要涉及C#编程语言、数据结构、设计模式、XML配置以及项目实践等多个方面。以下是对这些知识点的详细解析: 1. **C#编程**:实习生在...

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

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

    Java企业级开发综合技能知识总结

    - Java通过方法覆盖和方法重载实现多态性。 38. **垃圾回收器的基本原理是什么?** - 跟踪对象的可达性,不可达的对象被视为垃圾并被回收。 39. **静态变量和实例变量的区别?** - 静态变量属于类级别,所有...

    JAVA面试题目

    finalize是Object类的一个方法,当垃圾回收器确定不存在对该对象的更多引用时,会调用对象的finalize()方法。 36. heap和stack有什么区别? heap是堆内存,存储对象的实例;stack是栈内存,存储局部变量和方法调用...

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

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

Global site tag (gtag.js) - Google Analytics