`
xiaoliang330
  • 浏览: 115506 次
  • 性别: 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)`,...

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

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

    集成运放 电压比较器 迟滞比较器 窗口比较器

    集成运放电压比较器迟滞比较器窗口比较器 本文主要讲解了集成运放电压比较器迟滞比较器窗口比较器的知识点。集成运放电压比较器是一种基本的电路单元,广泛应用于模拟电路和数字电路的接口、电平检测、波形产生和...

    TLV3501过零比较器电路设计

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

    DynamicComparator:Java 动态比较器

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

    程序实现时间排序Comparator

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

    java比较器comparator使用示例分享

    Java中的`Comparator`接口是用于定制排序规则的关键工具,它允许我们按照自定义的方式对对象进行排序。在Java集合框架中,例如`ArrayList`、`LinkedList`等,我们可以使用`Collections.sort()`方法对集合进行排序,...

    简单电压比较器-迟滞比较器-窗口比较器.ppt

    简单电压比较器-迟滞比较器-窗口比较器大全

    Java Comparator比较器实例解析

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

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

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

    八位比较器基于VHDL语言编写

    八位比较器是一种数字逻辑电路,它用于比较两个八位二进制数的大小关系。在数字系统设计中,VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种广泛使用的硬件描述语言,能够用来设计...

    verilog4位比较器

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

    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软件进行制作。可以被大多数工科学生所使用

    详解什么是迟滞比较器

    迟滞比较器又可理解为加正反馈的单限比较器。 单限比较器,如果输入信号Uin在门限值附近有微小的干扰,则输出电压就会产生相应的抖动(起伏)。在电路中引入正反馈可以克服这一缺点。图1a给出了一个迟滞比较器,人们...

    用C#写的一个比较器

    在编程领域,比较器(Comparator)是一个非常重要的概念,它主要用于自定义对象的排序规则。在C#中,我们可以创建自己的比较器类来实现特定类型的比较逻辑。本实例将深入探讨如何使用C#编写一个比较器,以及在实际...

    LM311各种比较器电路的实现

    高灵活性的电压比较器

Global site tag (gtag.js) - Google Analytics