//网上找的一个例子自己修改了下分享下,可以传多个排序字段数组
public class SortList<E>{

        public static Logger loger = LoggerFactory.getLogger(SortList.class);
/**
*
* 方法描述:自定义排序(这里暂时只支持3种属性同时排序,后面要加属性可扩展下面哪种类型的排序的if else)
* 这里是根据中英文首字母第一排序
* @param 1 list 要排序的对象集合
* @param 2 methods 要排序的对象属性
* @param 3 sorts 属性是降序还是升序 如果传NULL 默认升序(sorts数组跟methods是一个一个对应的)
* @Title: Sort *
* @modifier
*/
@SuppressWarnings("all")
public void Sort(List<E> list, final String[] methods, final String[] sorts){
Collections.sort(list, new Comparator() {
public int compare(Object a, Object b) {
int ret = 0;
try{
if(methods==null || methods.length==0){
loger.error("未传入排序字段");
}else{
Method m1 = ((E)a).getClass().getMethod(methods[0], null);
Method m2 = ((E)b).getClass().getMethod(methods[0], null);
if(sorts == null || sorts.length==0 || "asc".equals(sorts[0])){
ret = ChinaInitial.getPYIndexStr(m1.invoke(((E)a), null).toString(),false).substring(0, 1).compareTo(ChinaInitial.getPYIndexStr(m2.invoke(((E)b), null).toString(),false).substring(0, 1));
}else{
ret = ChinaInitial.getPYIndexStr(m2.invoke(((E)b), null).toString(),false).substring(0, 1).compareTo(ChinaInitial.getPYIndexStr(m1.invoke(((E)a), null).toString(),false).substring(0, 1));
}
if(methods.length>1){
for(int i = 0;i<methods.length;i++){
if(i==0) continue;
String method = methods[i];
Method m3 = ((E)a).getClass().getMethod(method, null);
Method m4 = ((E)b).getClass().getMethod(method, null);
Object m3Obj = m3.invoke(((E)a), null);
Object m4Obj = m4.invoke(((E)b), null);
if(m3Obj instanceof Date){
if(ret==0){
if(sorts==null || sorts.length==0 || sorts[i].equals("asc")){
ret = ((Date)m4Obj).compareTo((Date)m3Obj);
}else{
ret = ((Date)m3Obj).compareTo((Date)m4Obj);
}
}
}else if(m3Obj instanceof Integer){
if(ret==0){
if(sorts==null || sorts.length==0 || sorts[i].equals("asc")){
ret = ((Integer)m4Obj).compareTo((Integer)m3Obj);
}else{
ret = ((Integer)m3Obj).compareTo((Integer)m4Obj);
}
}
}
}
}
}
}catch(Exception e){
loger.error("异常",e);
}
return ret;
}
});
}
}
//下面是获取中文首字母的类
/***
*
* 得到中文首字母
*
* @author lxm_09
*/ public class ChinaInitial { /**
*
* @param args
*/ public static void main(String[] args) { String str = "我是中国人"; System.out.println("中文首字母:" + getPYIndexStr(str, false)); } /**
*
* 返回首字母
*
* @param strChinese
*
* @param bUpCase
*
* @return
*/ public static String getPYIndexStr(String strChinese, boolean bUpCase) { try { StringBuffer buffer = new StringBuffer(); byte b[] = strChinese.getBytes("GBK");// 把中文转化成byte数组 for (int i = 0; i < b.length; i++) { if ((b[i] & 255) > 128) { int char1 = b[i++] & 255; char1 <<= 8;// 左移运算符用“<<”表示,是将运算符左边的对象,向左移动运算符右边指定的位数,并且在低位补零。其实,向左移n位,就相当于乘上2的n次方 int chart = char1 + (b[i] & 255); buffer.append(getPYIndexChar((char) chart, bUpCase)); continue; } char c = (char) b[i]; if (!Character.isJavaIdentifierPart(c))// 确定指定字符是否可以是 Java
// 标识符中首字符以外的部分。 c = 'A'; buffer.append(c); } return buffer.toString(); } catch (Exception e) { System.out.println((new StringBuilder()).append("\u53D6\u4E2D\u6587\u62FC\u97F3\u6709\u9519")
.append(e.getMessage()).toString()); } return null; } /**
*
* 得到首字母
*
* @param strChinese
*
* @param bUpCase
*
* @return
*/ private static char getPYIndexChar(char strChinese, boolean bUpCase) { int charGBK = strChinese; char result; if (charGBK >= 45217 && charGBK <= 45252) result = 'A'; else if (charGBK >= 45253 && charGBK <= 45760) result = 'B'; else if (charGBK >= 45761 && charGBK <= 46317) result = 'C'; else if (charGBK >= 46318 && charGBK <= 46825) result = 'D'; else if (charGBK >= 46826 && charGBK <= 47009) result = 'E'; else if (charGBK >= 47010 && charGBK <= 47296) result = 'F'; else if (charGBK >= 47297 && charGBK <= 47613) result = 'G'; else if (charGBK >= 47614 && charGBK <= 48118) result = 'H'; else if (charGBK >= 48119 && charGBK <= 49061) result = 'J'; else if (charGBK >= 49062 && charGBK <= 49323) result = 'K'; else if (charGBK >= 49324 && charGBK <= 49895) result = 'L'; else if (charGBK >= 49896 && charGBK <= 50370) result = 'M'; else if (charGBK >= 50371 && charGBK <= 50613) result = 'N'; else if (charGBK >= 50614 && charGBK <= 50621) result = 'O'; else if (charGBK >= 50622 && charGBK <= 50905) result = 'P'; else if (charGBK >= 50906 && charGBK <= 51386) result = 'Q'; else if (charGBK >= 51387 && charGBK <= 51445) result = 'R'; else if (charGBK >= 51446 && charGBK <= 52217) result = 'S'; else if (charGBK >= 52218 && charGBK <= 52697) result = 'T'; else if (charGBK >= 52698 && charGBK <= 52979) result = 'W'; else if (charGBK >= 52980 && charGBK <= 53688) result = 'X'; else if (charGBK >= 53689 && charGBK <= 54480) result = 'Y'; else if (charGBK >= 54481 && charGBK <= 55289) result = 'Z'; else result = (char) (65 + (new Random()).nextInt(25)); if (!bUpCase) result = Character.toLowerCase(result); return result; } }

//调用示例

 SortList<Object> sortList = new SortList<Object>();
String[] param = {sortPropertyName};
String[] sorts = {sortRule};
sortList.Sort(resultList, param, sorts);

  

Java 中英文数字排序的更多相关文章

  1. CCF201503-2 数字排序 java(100分)

    试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输 ...

  2. java 使用 ArrayList 排序【包括数字和字符串】

    1.数字排序 /** * 数字排序 */ @Test public void t2() { List<Integer> list = new ArrayList<>(); li ...

  3. 基于Hadoop 2.6.0运行数字排序的计算

    上个博客写了Hadoop2.6.0的环境部署,下面写一个简单的基于数字排序的小程序,真正实现分布式的计算,原理就是对多个文件中的数字进行排序,每个文件中每个数字占一行,排序原理是按行读取后分块进行排序 ...

  4. CCF系列之数字排序(201503-2)

    问题描述试题编号: 201503-2试题名称: 数字排序时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输 ...

  5. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  6. Java实现常见排序算法

    常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import j ...

  7. Comparable与Comparator,java中的排序与比较

    1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...

  8. Java之List排序出错

    Java之List排序出错 Bound mismatch: The generic method sort(List<T>) of type Collections is not appl ...

  9. SQL SERVER 字符串按数字排序

    需求是这样的: 数据库表里面有一个字段类型是nvachar,存的值是数字和字符混合的,要实现先按数字排序,再按字母倒序. 思路: 考虑这个字段的值是否是有规律可循的,把要按数字排序的部分转换为数字,再 ...

随机推荐

  1. Ajax方法封装

    打算自己封装一个ajax方法,再不用jq库的情况下,直接引用: ajax作用:数据交互,在不刷新页面的情况下,发送请求,获取数据: 首页第一步常见一个ajax对象:XMLHttpRequest,之后会 ...

  2. 41、javaMail机制

    SMTP 是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议.SMTP 是建立在 TCP上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知. package com.ith ...

  3. [译]Node.js - Event Loop

    介绍 在读这篇博客之前,我强列建议先阅读我的前两篇文章: Getting Started With Node.js Node.js - Modules 在这篇文章中,我们将学习 Node.js 中的事 ...

  4. mvc DropDownList默认选项

    DDDContext db = new DDDContext(); List<SelectListItem> selectlistDistrict = new List<Select ...

  5. Flash Builder常见菊紧问题集锦

    FB的错误多多,不定什么时候就让你蛋碎,路遇操蛋问题集锦如下: 1.有次用Flash Builder 4.7,打开之后马上自动关闭,试了几次都这样,解决办法如下: 到C:\Documents and ...

  6. iOS 利用for循环创建九宫格

    // 利用for循环创建九宫格 - (void)createScratchableLatex{ // 总列数 ; // 每一格的尺寸 CGFloat cellW = (self.frame.size. ...

  7. windows电脑优化

    电脑磁盘已用99% 100%解决办法_百度经验 禁用superfetch服务 链接:http://jingyan.baidu.com/article/046a7b3edeea38f9c37fa911. ...

  8. RabbitMq 集群配置

    1. RabbitMQ 所需的附属安装包 1.1  openGL安装 执行命令: [root@localhost local]# yum install mesa-libGL-devel mesa-l ...

  9. cocos2d-x学习

    http://www.cocos2d-x.org/wiki/How_to_Start_A_New_Cocos2D-X_Game Cocos2d-x版本:cocos2d-x-3.6 一.设置脚本参数 1 ...

  10. Linux(Centos) 安装windows字体

    有时候在Linux中需要用到windows字体,比如微软雅黑字体,这个时候,可能就需要我们手动去安装字体了(当然,如果服务器上没装过),简单几步如下: 1.在$WINDOWS/Fonts目录中找到对应 ...