`

Java中,对List存放的对象按指定属性排序

阅读更多
转载的,试用过了,很好!

    /**
     * 对List对象按照某个成员变量进行排序
     * @param list       List对象
     * @param sortField  排序的属性名称
     * @param sortMode   排序方式:ASC,DESC 任选其一
     */
    public static <T> void sortList(List<T> list, final String sortField, final String sortMode) {
        Collections.sort(list, new Comparator<T>() {
            @Override
            public int compare(T o1, T o2) {
                try {
                    Class clazz = o1.getClass();
                    Field field = clazz.getDeclaredField(sortField); //获取成员变量
                    field.setAccessible(true); //设置成可访问状态
                    String typeName = field.getType().getName().toLowerCase(); //转换成小写

                    Object v1 = field.get(o1); //获取field的值
                    Object v2 = field.get(o2); //获取field的值

                    boolean ASC_order = (sortMode == null || "ASC".equalsIgnoreCase(sortMode));

                    //判断字段数据类型,并比较大小
                    if(typeName.endsWith("string")) {
                        String value1 = v1.toString();
                        String value2 = v2.toString();
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("short")) {
                        Short value1 = Short.parseShort(v1.toString());
                        Short value2 = Short.parseShort(v2.toString());
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("byte")) {
                        Byte value1 = Byte.parseByte(v1.toString());
                        Byte value2 = Byte.parseByte(v2.toString());
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("char")) {
                        Integer value1 = (int)(v1.toString().charAt(0));
                        Integer value2 = (int)(v2.toString().charAt(0));
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("int") || typeName.endsWith("integer")) {
                        Integer value1 = Integer.parseInt(v1.toString());
                        Integer value2 = Integer.parseInt(v2.toString());
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("long")) {
                        Long value1 = Long.parseLong(v1.toString());
                        Long value2 = Long.parseLong(v2.toString());
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("float")) {
                        Float value1 = Float.parseFloat(v1.toString());
                        Float value2 = Float.parseFloat(v2.toString());
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("double")) {
                        Double value1 = Double.parseDouble(v1.toString());
                        Double value2 = Double.parseDouble(v2.toString());
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("boolean")) {
                        Boolean value1 = Boolean.parseBoolean(v1.toString());
                        Boolean value2 = Boolean.parseBoolean(v2.toString());
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("date")) {
                        Date value1 = (Date)(v1);
                        Date value2 = (Date)(v2);
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else if(typeName.endsWith("timestamp")) {
                        Timestamp value1 = (Timestamp)(v1);
                        Timestamp value2 = (Timestamp)(v2);
                        return ASC_order ? value1.compareTo(value2) : value2.compareTo(value1);
                    }
                    else {
                        //调用对象的compareTo()方法比较大小
                        Method method = field.getType().getDeclaredMethod("compareTo", new Class[]{field.getType()});
                        method.setAccessible(true); //设置可访问权限
                        int result  = (Integer)method.invoke(v1, new Object[]{v2});
                        return ASC_order ? result : result*(-1);
                    }
                }
                catch (Exception e) {
                    String err = e.getLocalizedMessage();
                    System.out.println(err);
                    e.printStackTrace();
                }
                return 0; //未知类型,无法比较大小
            }
        });
    }
分享到:
评论

相关推荐

    Java对集合中的对象排序

    对集合中的对象进行排序,例如:List中存放了User对象,则可根据User对象的某一个属性进行顺序or倒序的排序

    Java开发技术大全(500个源代码).

    listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的简单类 useArray1.java 用反射机制使用数组示例1 ...

    java电话本集合框架版

    在这个"java电话本集合框架版"中,我们重点探讨的是如何利用Java的List接口及其实现类来构建一个功能丰富的电话簿系统。 首先,Java的List接口是集合框架的一部分,它定义了一个有序的元素集合,允许有重复的元素。...

    Java面试测试题目2018张大成总结

    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性 - 这是一种引用传递,即方法改变了原始对象的状态。 #### 42. 面向对象的特征 - **封装**:隐藏对象的实现细节。 - **继承**:创建子类来扩展...

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

    在Java集合框架中,如果要对对象进行排序,需要实现Comparable接口或者在构造时提供一个Comparator比较器。 14. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 要正确处理汉字...

    JAVA基础课程讲义

    容器是JAVA中存放对象的结构,包括Collection、List、Set和Map接口。迭代器用于遍历容器中的元素,Collections工具类提供了对集合的操作。Comparable接口用于对象间的比较,泛型提供了类型安全的集合操作。 第八章 ...

    Java语言开发相关单词

    根据提供的文件信息,我们可以整理出一系列与Java编程语言相关的关键词,并对这些关键词进行详细解释,以便更好地理解Java语言的核心概念和技术细节。 ### 公开访问修饰符:`public` `public`是Java中的一个访问...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    Java 中你可以凭借多态性,通过一个画圆的对象,来创建一个画椭圆或矩形的对象。不管是 画圆,画椭圆还是画矩形的方法,它们都有一个相同的方法名,但以不同的方式完成他们的 画圆的功能。 1.8 类和对象 1.8.1 ...

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    利用 First Fit 算法解决物流3D bin packing问题 Java实现

    - 初始化一个空箱子列表,用于存放箱子对象。 - 根据物品列表,按体积升序排序,以便先尝试小体积物品。 3. **算法流程**: - 对于每个物品: - 遍历所有箱子,按顺序检查每个箱子是否能容纳该物品。 - 如果...

    java八股文介绍.rar

    - 类与对象:Java是一种面向对象的语言,类是创建对象的模板,包含属性(变量)和行为(方法)。 - 数据类型:Java分为基本数据类型和引用数据类型。基本类型包括整型(byte, short, int, long)、浮点型(float, ...

    Java笔记 超级汇总

    TreeMap按自然排序或自定义比较器排序。 6. **IO流** - 文件操作:File类用于文件的创建、删除等操作,FileInputStream和FileOutputStream用于读写文件。 - 字节流与字符流:InputStream和OutputStream处理字节...

    Java基础整理

    - **数组常用方法**:Java中提供了多个内置方法来操作数组,如`sort()`用于排序、`equals()`用于比较等。 **2.9 面试题** 针对初学者可能遇到的一些常见Java基础知识面试题,如数组排序算法、数组遍历和最值等,...

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

    - Java中的内存泄漏通常是因为对象引用无法被垃圾回收器回收。 - 例如,长时间持有的对象引用,导致对象无法被垃圾回收。 37. **java中实现多态的机制是什么?** - Java通过方法覆盖和方法重载实现多态性。 38....

    JAVA上百实例源码以及开源项目源代码

    关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    java私塾面试题----JAVA基础3

    - Java接口中声明的属性默认为`public static final`,而C++虚类中的成员属性和方法则可以根据需求灵活定义访问级别。 #### 3. Java异常处理机制 Java异常处理机制主要包括以下关键字: - `try`:用于包裹可能抛...

    Java开发岗面试知识点解析

    以上是对 Java 开发岗面试中常见知识点的详细解析,希望对你的面试准备有所帮助。在面试过程中,不仅要掌握理论知识,还要注重实际问题解决能力和项目经验的积累,这样才能在竞争激烈的 IT 行业中脱颖而出。

    java学习笔记

    - 直接赋值形式:字符串被存放在常量池中,如果字符串已经存在于常量池,则不再创建新对象。 - 使用`new`关键字:会创建一个新的字符串对象,即使该字符串已经存在于常量池中,也会创建一个新的对象。 5. **...

Global site tag (gtag.js) - Google Analytics