`
xiaoliang330
  • 浏览: 114496 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

手写比较器comparator

 
阅读更多
项目中需要对一些数据进行排序,应用到了个比较强大的比较器,感觉还是很不错的,贴上代码:


public class XXXComparator<E> {
    private final Logger log = Logger.getLogger(XXXComparator.class);

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void sort(List<E> list, final String method, final String sortType) {
        // list 要比较的list 对象列表
       // method传入相应的get方法签名
      // sortType  desc or asc

        Collections.sort(list, new Comparator() {

            public int compare(Object a, Object b) {
                int ret = 0;
                try {
                    Method m1 = ((E) a).getClass().getMethod(method, null);
                    Method m2 = ((E) b).getClass().getMethod(method, null);
                    if (sortType != null && "desc".equals(sortType)) {
                        ret = m2.invoke(((E) b), null).toString()
                                .compareTo(m1.invoke(((E) a), null).toString());
                    } else {
                        ret = m1.invoke(((E) a), null).toString()
                                .compareTo(m2.invoke(((E) b), null).toString());
                    }
                } catch (NoSuchMethodException e) {
                    log.error(e);
                } catch (InvocationTargetException e) {
                    log.error(e);
                } catch (IllegalAccessException e) {
                    log.error(e);
                }
                return ret;
            }
        });
    }

}




比如我有一个People对象,里面有  name, age 等属性,
现在我有一个People的list列表,需要进行排序,如按name或者age排

好了,可以这么写:


XXXComparator<People> sortList = new XXXComparator<People>();
String method = "getName"; //or  'getAge'
String orderByType = "desc";
sortList.sort(peopleList, method, orderByType);



这样就可以实现按 属性排序了



对以上comparator进行了优化,如果类型为int的数据应用以上方法会存在问题



public class XXXComparator<E> {
    private final Logger log = Logger.getLogger(XXXComparator.class);

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public void sort(List<E> list, final String methodName, final String sortType) {
        Collections.sort(list, new Comparator() {

            public int compare(Object a, Object b) {
                int ret = 0;
                try {

                    Method method = a.getClass().getMethod(methodName);

                    Object aResult = method.invoke(a);
                    Object bResult = method.invoke(b);

                    if (aResult == null) {
                        return -1;
                    }
                    if (bResult == null) {
                        return 1;
                    }
                    if (aResult instanceof String) {
                        String com1 = "desc".equals(sortType) ? (String) aResult : (String) bResult;
                        String com2 = "desc".equals(sortType) ? (String) bResult : (String) aResult;
                        log.info("aResult= " + aResult + "\nbResult= " + bResult);
                        return com1.toLowerCase().compareTo(com2.toLowerCase());

                    }

                    if (aResult instanceof Comparable) {
                        Comparable com1 = "desc".equals(sortType) ? (Comparable) aResult
                                : (Comparable) bResult;
                        Comparable com2 = "desc".equals(sortType) ? (Comparable) bResult
                                : (Comparable) aResult;
                        return com1.compareTo(com2);

                    }

                } catch (NoSuchMethodException e) {
                    log.error(e);
                } catch (InvocationTargetException e) {
                    log.error(e);
                } catch (IllegalAccessException e) {
                    log.error(e);
                }
                return ret;
            }
        });
    }

}





分享到:
评论

相关推荐

    比较器Comparator简单用法

    在给定的"比较器Comparator简单用法"主题中,我们将深入探讨如何使用`Comparator`以及Apache Commons Lang库中的相关方法。 首先,`Comparator`接口位于`java.util`包下,它包含一个方法`compare(T o1, T o2)`,...

    hysteresis-comparator.rar_PSIM中比较器_PSIM中的比较器_PSIM比较器_PSIM滞环_psim

    PSIM中滞环控制器,环宽、频率、占空比等等可以自己设定。

    List对象集合的排序:比较器Comparator(简单例子)

    `Comparator`是一个可以比较两个对象的类,它提供了一种方式来定义自定义的比较规则,从而实现灵活的排序逻辑。 `Comparator`接口位于`java.util`包中,它包含了一个方法`compare(T o1, T o2)`,这个方法需要比较两...

    比较器_比较器vhdl_比较器_

    在数字电路设计中,比较器是一种非常基础且重要的元件,用于比较两个数字信号的大小。在 VHDL(Very High-Speed Integrated Circuit Hardware Description Language)中,我们可以编写代码来描述这种功能,以便在 ...

    JAVA 比较器实例

    Java中的比较器(Comparator)是实现自定义排序的关键工具,它允许我们按照特定逻辑对对象进行排序,而不仅仅是依赖于类的自然顺序。在实际开发中,比较器有着广泛的应用,比如在数据处理、列表排序、集合筛选等方面...

    TLV3501过零比较器电路设计

    在电子电路设计中,过零比较器是一种常用的基础电路,它具有将交流信号转换为同频率的双极性矩形波的能力。这种转换在测量正弦波的频率、相位以及其他信号处理中非常有用。TLV3501是一款高性能的过零比较器,适用于...

    程序实现时间排序Comparator

    通过实现`Comparator`接口,可以定义一个比较器,用于比较两个对象并确定它们之间的顺序关系。 ### 2. 代码示例分析 在提供的代码中,我们看到了一个具体的`Comparator`实现——`ComparatorObject`类。这个类被...

    fpga通过vivado实现比较器

    在本文中,我们将深入探讨如何使用Xilinx的Vivado工具在FPGA(Field Programmable Gate Array)上实现一个比较器。FPGA是一种可编程逻辑器件,它允许开发者根据需求自定义硬件逻辑,广泛应用于数字信号处理、图像...

    Java Comparator比较器实例解析

    Java Comparator比较器实例解析 Java Comparator是一种强大的比较器接口,通过实现Comparator接口,可以自定义比较规则,实现对对象的排序和比较。本文将详细介绍Java Comparator比较器实例解析,通过示例代码介绍...

    DynamicComparator:Java 动态比较器

    在Java编程语言中,`DynamicComparator`是一种实现比较器(Comparator)的方式,它允许在运行时根据特定条件来比较对象。这种技术对于处理多种比较逻辑或者需要灵活改变比较规则的场景非常有用。本文将深入探讨Java...

    运算放大器为什么不能用作比较器

    而比较器(Comparator)是一种专门用于比较两个电压大小的电路,其输出状态仅取决于两个输入端电压的相对大小。尽管运算放大器和比较器在功能上有相似之处,但在设计目的、性能参数和应用场景方面存在显著差异。以下...

    verilog4位比较器

    在数字逻辑设计中,比较器是一种常见的数字电路,用于比较两个二进制数的大小。在本场景中,我们讨论的是一个使用Verilog硬件描述语言(HDL)编写的4位比较器。Verilog是一种广泛使用的语言,用于描述数字系统的硬件...

    STM32F0培训:12. 比较器.pdf

    STM32F0系列微控制器中的比较器(Comparator, COMP)是一种用于模拟信号处理的外设,它可以比较两个模拟信号并根据比较结果输出相应的数字信号。在STM32F0的培训材料中,第12章专门介绍了比较器的特性、配置、应用...

    AVR学习笔记六、模拟比较器和ADC实验

    在本篇AVR学习笔记中,我们将深入探讨模拟比较器(Analog Comparator)和模数转换器(ADC,Analog-to-Digital Converter)这两个在微控制器应用中至关重要的概念,特别是针对AVR系列微控制器。这两者都是数字系统与...

    java对象比较器

    给定的代码实现了一个通用的比较器类`Comparators`,该类提供了一个静态方法`getComparator()`,用于返回一个实现了`java.util.Comparator`接口的匿名内部类实例。这个比较器能够处理不同类型的对象:字符串(`...

    在Typescript上编写有用的比较器函数

    在TypeScript中编写有用的比较器函数是提升代码质量和可维护性的重要技巧。比较器函数主要用于对数据进行排序、过滤或查找,特别是在数组操作中。理解如何有效地定义和使用比较器函数,可以让你的JavaScript(以及...

    java Comparator 用法 例子

    Java中的Comparator接口是排序的关键工具,它允许程序员自定义对象的比较规则,从而在集合、数组或树结构(如TreeSet、TreeMap)中实现定制化的排序。在Java的Collections框架中,Comparator扮演着重要的角色,特别...

    滞回电压比较器仿真

    滞回电压比较器的仿真,利用multisim软件进行制作。可以被大多数工科学生所使用

    LM311各种比较器电路的实现

    高灵活性的电压比较器

    定义比较器,比较数组中值大小

    在这个过程中,定义比较器(Comparator)是一种灵活且强大的方法,它允许我们自定义元素之间的比较规则。本文将深入探讨如何定义比较器来比较数组中值的大小,并通过一个具体的示例进行说明。 首先,我们需要了解...

Global site tag (gtag.js) - Google Analytics