Java 多字段排序Comparator(兼容Date,Integer,Doubel,Long)
Java 反射类:ReflexUtil
public class ReflexUtil {
static Logger logger = LoggerFactory.getLogger(ReflexUtil.class);
//getMethod
static public Object invokeMethod(String propertiesName, Object object) {
try {
if(object==null) return null;
if (!propertiesName.contains(".")) {
String methodName = "get"+getMethodName(propertiesName);
Method method = object.getClass().getMethod(methodName);
return method.invoke(object);
}
String methodName = "get"+getMethodName(propertiesName.substring(0,propertiesName.indexOf(".")));
Method method = object.getClass().getMethod(methodName);
return invokeMethod(propertiesName.substring(propertiesName.indexOf(".")+1), method.invoke(object));
} catch (Exception e) {
logger.error(e.toString(), e);
return null;
}
}
private static String getMethodName(String fildeName) {
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
public static void main(String args[]) {
Video video = new Video();
Album album = new Album();
album.setAlbumId(346l);
video.setAlbum(album);
video.setVideoId(126l);
System.out.println(ReflexUtil.invokeMethod("album.albumId", video));
}
}
Java 对象排序 : CompareUtil ()
package com.gochinatv.vrs.framework.util; import com.alibaba.fastjson.JSONObject;
import com.gochinatv.vrs.framework.bean.LabelAlbum;
import com.gochinatv.vrs.framework.bean.Video; import java.util.*; /**
* Created by shhao
* Date: 14-5-6.
* Time:下午4:48
*/
public class CompareUtil { //sort 1正序 -1 倒序 filed 多字段排序
public static <T> Comparator createComparator(int sort, String... filed) {
return new ImComparator(sort, filed);
} public static class ImComparator implements Comparator {
int sort = 1;
String[] filed; public ImComparator(int sort, String... filed) {
this.sort = sort == -1 ? -1 : 1;
this.filed = filed;
} @Override
public int compare(Object o1, Object o2) {
int result = 0;
for (String file : filed) {
Object value1 = ReflexUtil.invokeMethod(file, o1);
Object value2 = ReflexUtil.invokeMethod(file, o2);
if (value1 == null || value2 == null) {
continue;
}
if (value1 instanceof Integer) { //Integer整数序排序
int v1 = Integer.valueOf(value1.toString());
int v2 = Integer.valueOf(value2.toString());
if (v1 == v2) continue;
if (sort == 1) {
return v1 - v2;
} else if (sort == -1) {
return v2 - v1;
}
} else if (value1 instanceof Date) { //Date类型排序
Date d1 = (Date) value1;
Date d2 = (Date) value2;
if (d1.compareTo(d2) == 0) continue;
if (sort == 1) {
return d1.compareTo(d2);
} else if (sort == -1) {
return d2.compareTo(d1);
}
} else if (value1 instanceof Long) { //Long排序
long v1 = Long.valueOf(value1.toString());
long v2 = Long.valueOf(value2.toString());
if (v1 == v2) continue;
if (sort == 1) {
return v1 > v2 ? 1 : -1;
} else if (sort == -1) {
return v2 > v1 ? 1 : -1;
}
} else if (value1 instanceof Double) { //Double排序
Double v1 = Double.valueOf(value1.toString());
Double v2 = Double.valueOf(value2.toString());
if (v1 == v2) continue;
if (sort == 1) {
return v1 > v2 ? 1 : -1;
} else if (sort == -1) {
return v2 > v1 ? 1 : -1;
}
} } return result;
}
} public static void main(String args[]) {
Video label1 = new Video();
label1.setDisplayOrder(1);
label1.setCreateTime(DateUtils.convert("2014-01-01"));
Video label2 = new Video();
label2.setDisplayOrder(3);
label2.setCreateTime(DateUtils.convert("2014-01-02"));
Video label3 = new Video();
label3.setDisplayOrder(2);
label3.setCreateTime(DateUtils.convert("2014-01-03"));
Video label4 = new Video();
label4.setDisplayOrder(2);
label4.setCreateTime(DateUtils.convert("2014-01-01"));
Video label5 = new Video();
label5.setDisplayOrder(4);
label5.setCreateTime(DateUtils.convert("2014-01-05"));
List<Video> list = new ArrayList<Video>();
list.add(label1);
list.add(label2);
list.add(label3);
list.add(label4);
list.add(label5);
Collections.sort(list, CompareUtil.createComparator(1, "createTime", "displayOrder"));
for (int i = 0; i < list.size(); i++) {
Video labelAlbum = list.get(i);
System.out.println("displayorder:" + labelAlbum.getDisplayOrder() + " sequence:" + DateUtils.convert(labelAlbum.getCreateTime()));
}
}
}
Java 多字段排序Comparator(兼容Date,Integer,Doubel,Long)的更多相关文章
- Java 8 Lambda排序 : Comparator example
1. Classic Comparator example. Comparator<Developer> byName = new Comparator<Developer>( ...
- Comparable与Comparator,java中的排序与比较
1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...
- Vector 多字段排序的Java实现
要求实现: Vector 多字段排序,其中首元素不参与排序,第一二三字段升序,空排到前面. //这里是Vector的元素定义 public class AVectorElement { private ...
- java的list集合如何根据对象中的某个字段排序?
转自:http://blog.csdn.net/wangjuan_01/article/details/51351633 List集合按某个字段排序 package wjtest_01; import ...
- java实现按对象某个字段排序,排序字段和规则自定义
@SuppressWarnings({ "unchecked", "rawtypes" }) private <T> void sort(List& ...
- JAVA实现按列表中元素的时间字段排序
JAVA代码实现按列表中元素的时间字段排序 导语: 工作中遇到一个问题,调用第三方接口返回的数据没有按时间倒序排列,测试说要加,然后在网上找到一个解决办法,这里记录一下 需求: 如下图列表,按生日进行 ...
- Java TreeSet集合 比较器排序Comparator的使用
比较器排序Comparator的使用 存储学生对象,并遍历,创建TreeSet集合使用带参构造方法 要求,按照学生年龄从小到大排序,如果年龄相同,则按照姓名的字母循序排序 结论 用TreeSet集合存 ...
- 在Java中使用Collections.sort 依据多个字段排序
一.如何使用Collections工具类进行排序 使用Collections工具类进行排序主要有两种方式: 1.对象实现Comparable接口,重写compareTo方法 /** * @author ...
- ElasticSearch java API 按照某个字段排序
searchRequestBuilder.addSort("publish_time", SortOrder.DESC); 按照某个字段排序的话,hit.getScore()将会失 ...
随机推荐
- div中的内容居中
要使div中的内容居中显示,不仅div要设定“text-align:centr" ,内置对象要添加margin:auto;属性才能使其在firefox等其他浏览器中也能居中.
- POP动画引擎中Layer与CALayer的一点区别
POP动画引擎是facebook提供的一个开源框架, 可以实现很多的动画效果, 这里就不一一介绍啦, 有兴趣的童鞋请移步: https://github.com/facebook/pop 下面简单的讲 ...
- java学习——正则表达式
本文内容来源于 历经5年锤练--史上最适合初学者入门的Java基础视频 例:要求QQ号长度为5~15位,不能以0开头 String qq="123456"; String reg ...
- String分割类
StringTokenizer类 用的时候要 import java.util.StringTokenizer; StringTokenizer b=new StringTokenizer( Stri ...
- linux 防火墙--firewalld学习
firewalld是centos7默认的防火墙,相比于iptables重要的优势: 1 支持动态更新: 2 不用重启服务: 同时增加了防火墙的“zone”概念,具体差异没做过多了解,这篇文章只记录fi ...
- 发布一款仿天猫产品放大镜JQuery插件
效果如下图: 1.原图 2.放大镜效果: 插件源码如下: /* * * JQUERY 简洁无极放大镜插件-zoomer * Author:盛世游侠 * QQ:418873053 * Date:2013 ...
- 基于jQuery编写的页面跳转简单的小插件
其实这个很简单,就是一个脚本函数和两个参数(url,jupetime), 开始实现步骤: 1.像页面引用一个jquery工具包 2.在javascript脚本编写自定义方法: 方法声明: $.exte ...
- Zend Studio 8.0.1 新建远程项目无法展示远程项目列表的问题
PHP的开发工具还是不少的,有用VI,有用eclipse.Netbean.sublime Text,当然用的比较多的还是Zend Studio,这次试用Zend Studio 8.0.1 开发几个PH ...
- Nvidia显卡怎样查看显存大小及硬件相关信息
在电脑上安装Nvidia显卡驱动,平时也会通过Nvidia控制面板来查看显示显存位宽及宽带.显示显存容量和显示显存芯片信息等等,那么该如何查看Nvidia显存大小以及Nvidia硬件相关信息呢? 1. ...
- RTC 之 ARM7 2136 ARM9之2410
RTC 的原理都是一样的,但计数过程中的计数换算却不相同: ARM9 直接出来的是BCD 码,也就是0x30 就是30秒,没有换算了,而ARM7则不同,他是直接计数的,十进制的30秒则是0x1E, ...