`

java反射之对象通用排序

    博客分类:
  • java
 
阅读更多

http://blog.csdn.net/youjianbo_han_87/article/details/2591584

 

 

 

java反射之对象通用排序

 

 

/**   
* @Title: ObjectSort.java
* @Package sort
* @Description: TODO(用一句话描述该文件做什么)
* @author youjianbo   
* @date 2011-3-9 上午10:28:53
* @version V1.0   
*/  
package sort;

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 ObjectSort {

    /**
     * @param args
     */
    public static void main(String[] args) {
        /**
         *
         * author: youjianbo
         * date:2008-6-27
         * purpose: 根据对象的某个或者某些属性排序
         * Java里面包含8个基本数据类型,分别是:boolean、byte、char、short、int、float、douboe、long
         * 只比较非boolean和byte类型的属性,和大多数运用环境适应,如果有特殊要求,请自己修改。
         * 使用时只要将对象属性列表和需要排序的List传入即可
         * **/
        List arrayDemo = new ArrayList();
       
        Person p1 = new Person();
        p1.setName("张三");
        p1.setAge(200);
        p1.setSalary(100);
       
        Person p2 = new Person();
        p2.setName("李四");
        p2.setAge(22);
        p2.setSalary(100);
       
        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);
       
        Person p8= new Person();
        p8.setName("扣九哥哥");
        p8.setAge(22);
        p8.setSalary(2000);
       
        arrayDemo.add(p1);
        arrayDemo.add(p2);
        arrayDemo.add(p3);
        arrayDemo.add(p4);
        arrayDemo.add(p5);
        arrayDemo.add(p6);
        arrayDemo.add(p7);
        arrayDemo.add(p8);
       
        //*********开始比较********//
        CommonComparator comparator = new CommonComparator();
       
//        System.out.println("------0.按照名称从小到大比较---------");
//        comparator.setFields_user(new String[]{"name"});
//        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"});
//        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());
//        }
        System.out.println("------1.按照姓名,年龄和月薪从低到高比较---------");
        comparator.setFields_user(new String[]{"name","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++)
        {
            return compareField(obj1,obj2,fields_user[i]);
        }
        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]));
                    //-------中文会有问题--------
//                  String v1 = getFieldValueByName(fieldName,o1).toString();
//                  String v2 = getFieldValueByName(fieldName,o2).toString();
//                 
//                  if(v1.compareTo(v2)>0){
//                      return 1;
//                  }else if(v1.compareTo(v2)==0)                  {
//                      return 0;
//                  }else{
//                      return -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;
        }
    }
}

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

分享到:
评论

相关推荐

    java中List对象排序通用方法

    这个通用排序方法不仅减少了重复代码,还提高了代码的可读性和可维护性。但是,需要注意的是,反射操作虽然强大,但也存在一定的性能开销。因此,在对大量数据进行排序时,应权衡性能和灵活性,考虑是否使用更高效的...

    java中list排序

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

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

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

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

    接着,我们来看Java反射机制。反射允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问字段。在JDBC封装中,反射非常有用,因为它允许在运行时创建和执行SQL语句,而不必在代码中硬编码...

    List对象排序通用方法

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

    List 对象属性排序

    * 通用排序方法 * @param list 需要排序的List * @param method 对象属性的获取方法名称 * @param sort 排序方式:desc(降序)或asc(升序) */ @SuppressWarnings({"unchecked", "rawtypes"}) public void ...

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

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

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

    Java反射机制是Java编程语言中的一个核心特性,它允许运行时动态访问和修改类的信息,包括类名、方法、属性等。在Java中,反射机制主要用于以下方面: 1. **运行时类型检查**:在程序运行过程中,可以使用反射获取...

    Java对象交换方法剖析.pdf

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

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

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

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

    标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition...

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

    标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition...

    java面试真题通用题目8卷

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

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

    标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition)...

    thinking in java(一本学java必看的书)

    五、Java反射与注解 1. 反射:反射机制允许程序在运行时动态获取类的信息并操作对象,是实现元编程的关键。 2. 注解:注解是一种元数据,可以用于提供编译器或运行时的信息,如@Autowired、@Override等。 六、Java...

    Java通用范例开发金典配套源代码

    【Java通用范例开发金典配套源代码】涵盖了Java编程中的多个重要知识点,包括类的处理、静态成员的使用、类反射、字符处理、数组与集合的处理以及窗体效果等。以下是对这些知识点的详细解释: 1. **类的处理**: -...

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

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

    java开发中常用的通用工具类.rar

    Java反射机制允许在运行时动态访问类的信息,如获取类、字段、方法等,并能调用私有方法,创建实例等。 以上就是Java开发中常用的通用工具类的一部分,它们极大地丰富了Java的生态,提升了开发效率。使用这些工具...

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

    标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition...

    java核心知识word版-1

    8. **反射**:Java的反射机制允许程序在运行时动态地获取类的信息(如类名、方法名)并操作对象。这对于创建通用代码、序列化、动态代理等场景非常有用。 9. **泛型**:Java泛型引入于JDK 5,用于增强类型安全性,...

Global site tag (gtag.js) - Google Analytics