饿了么开源项目:Java Comparator生成器

版权所有。所有权利保留。

欢迎转载,转载时请注明出处:

http://blog.csdn.net/xiaofei_it/article/details/51399159

公司Android项目里经常需要对元素进行排序,而排序都是多字段的,相应的Comparator比较难写。于是我就写了这么一个工具类,用户只需要指定排序规则,便可以自动生成相应的Comparator。

项目地址:

https://github.com/Xiaofei-it/ComparatorGenerator

特色

Java编程经常要对数据进行排序,此时需要写一个Comparator。但Comparator比较难写,尤其是在多字段排序的时候更加复杂。

你可以方便地使用此工具类生成Comparator。你只需要指定在排序的时候要依据哪些字段以及升序还是降序,这个工具类会为你生成相应的Comparator。

Gradle

dependencies {
    compile ‘xiaofei.library:comparator-generator:1.1‘
}

Maven

<dependency>
  <groupId>xiaofei.library</groupId>
  <artifactId>comparator-generator</artifactId>
  <version>1.1</version>
  <type>pom</type>
</dependency>

用法

现在假设要对一个类的许多实例进行排序。排序的时候依据某些字段或者函数的返回值。

那么你要做的就是告诉工具类这些字段和函数,并且指定权重以及升降序。

有两种方法指指定排序策略:使用注解或者使用API。

使用注解

现在要对Item1生成Comparator。排序的时候首先对price进行升序,如果price相同则对distance进行降序,如果distance也相同则对itemName进行升序。

那么对Item1的相应字段加上注解:

class Item1 {
    @Criterion(priority = 3, order = Order.ASCENDING)
    private int price;
    @Criterion(priority = 2, order = Order.DESCENDING)
    private int distance;
    @Criterion(priority = 1) // order默认是升序
    private String itemName;
}

使用的时候只需要这样写:

Comparator<Item1> comparator = new ComparatorGenerator<Item1>(Item1.class).generate();
Arrays.sort(items1, comparator);

再看一个例子。对Item3排序,先按总价升序,再按itemName升序。总价是由函数给出的,我们依然可以对函数加上注解。

注意:函数必须是无参成员函数!

class Item3 {

    private int price;
    private int number;

    @Criterion(priority = 1) // 默认升序
    private String itemName;

    @Criterion(priority = 2, order = Order.ASCENDING)
    int getTotalPrice() {
        return price * number;
    }

}

使用的时候写如下代码:

Comparator<Item3> comparator = new ComparatorGenerator<Item3>(Item3.class).generate();
Arrays.sort(items3, comparator);

使用API

某些时候要对一个类写出不同Comparator,比如对订单排序的时候会有很多种:距离优先、评价优先、价格优先。

那么这时候就不能使用注解,因为通过注解只能生成唯一的Comparator。

这时候使用api直接指定。

以下有一个类Item2。

class Item2 {

    private int price;

    private int distance;

    private String itemName;
}

首先对price升序,然后对distance降序,然后对itemName升序。

Comparator<Item2> comparator2 =
    new ComparatorGenerator<Item2>(Item2.class)
        .addCriterion(3, "price", Order.ASCENDING)
        .addCriterion(2, "distance", Order.DESCENDING)
        .addCriterion(1, "itemName") // 默认升序
        .generate();
Arrays.sort(items2, comparator2);

再看一个例子。

class Item4 {

    private int price;
    private int number;
    private int distance;

    int getTotalPrice() {
        return price * number;
    }
}

对Item4排序,首先按总价升序,然后按距离降序。

Comparator<Item4> comparator4 =
    new ComparatorGenerator<Item4>(Item4.class)
        .addCriterion(3, "getTotalPrice", Order.ASCENDING)
        .addCriterion(2, "distance", Order.DESCENDING)
        .generate();
Arrays.sort(items4, comparator4);
时间: 2024-10-12 13:38:36

饿了么开源项目:Java Comparator生成器的相关文章

饿了么开源项目:便捷高效的Android数据持久化存储框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51436972 Android应用开发时经常要对许多数据进行持久化存储,便于以后访问. 对于int.double.boolean这些基本数据,可以使用SharedPreference.对于一些对象,往SharedPreference里存储的时候需要使用序列化技术.如果对象很大,或者碰到列表.数组等结构,就必须使用数据库.而使用数据库比较麻烦,成

饿了么开源项目Hermes:新颖巧妙易用的Android进程间通信IPC框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51464518 Android进程间通信IPC是比较高级的话题,很多Android程序员碰到IPC就觉得头疼,尤其是AIDL这类东西. 公司最近在研究DroidPlugin插件开发,DroidPlugin把每个子app都变成一个进程.这样的话子app和主app如果需要共享数据,就需要IPC.所以我开发了Hermes框架,让IPC变得非常简单优雅

可能是国内最火的开源项目 —— C/C++ 篇

高性能 TCP/UDP/HTTP 通信框架 HP-Socket https://www.oschina.net/p/hp-socket 评分:9.8,收藏:1404 HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++.C#.Delphi.E(易语言).Java.Python 等编程语言接口.HP-Socket 对通信层实现完全封装,应用程序不必关

Java开源项目(备查)

转自:http://www.blogjava.net/Carter0618/archive/2008/08/11/221222.html Spring Framework  [Java开源 J2EE框架] Spring 是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯.Spring的架构基础是基于使用JavaBean属性的 Inversion of Control容器.然而,这仅仅是完整图景中的一部分

Java 最常用类(前100名)来自一万个开源项目

大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库,也有第三方库.每个类在同一个项目中只计数一次,下面的列表中显示前 100 名的类. 以下列表中按使用最多的类进行排序,第三个数值表示 10000 个项目里使用到该类的项目数,而完整的列表请看 here. java.util.ArrayList(6958) java.io.IOException(6866) java.util.

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

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬.向往!此时此景,笔者只专注Android.Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能.编辑音乐软件的朋友,这款实例会对你有所帮助.Calendar万年历 1个目标文件EJ

2013 年开源中国 10 大热门 Java 开源项目

2013 年结束了,我们根据过去一年的用户访问.交流分享和项目本身的更新频度等诸多角度对收录于开源中国的近三万款开源软件进行统计,从而得出前 XX 名最受欢迎的开源软件,仅供参考. 本排行榜主要是针对开源中国社区在2013年度最受欢迎的 10 大热门 Java 开源项目根据用户访问量.讨论和关注等角度进行筛选,从而得出前 10 名的 Java 开源软件列表: 1. JFinal JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功

2018年阿里巴巴关于java重要开源项目汇总

1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud Alibaba 致力于提供分布式应用服务开发的一站式解决方案.此项目包含开发分布式应用服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务. 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统. 地址:ht

阿里巴巴的26款超神Java开源项目

目录 1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba 2. JDBC 连接池.监控组件 Druid 3. Java 的 JSON 处理器 fastjson 4. 服务框架 Dubbo 5. 企业级流式计算引擎 JStorm 6. apns4j 7. 分布式数据层 TDDL 8. 轻量级分布式数据访问层 CobarClient 9. 淘宝定制 JVM:TaobaoJVM 10. Java 图片处理类库 SimpleImage 11. redis 的 java 客户