//网上找的一个例子自己修改了下分享下,可以传多个排序字段数组
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. VMWare MAC系统调整磁盘

    VMware,打开虚拟文件,调整磁盘大小. 从40G调整到80G 进入虚拟机,打开终端 diskutil list;diskutil resizeVolume disk0s2 80GB http:// ...

  2. Generate transparent shape on image

    Here is an example code to generate transparent shape on image. Need to pay attention can not use cv ...

  3. nginx的优化

    Nginx 优化 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/P ...

  4. Kafka深入理解-3:Kafka如何删除数据(日志)文件

    Kafka作为消息中间件,数据需要按照一定的规则删除,否则数据量太大会把集群存储空间占满. 参考:apache Kafka是如何实现删除数据文件(日志)的 Kafka删除数据有两种方式 按照时间,超过 ...

  5. 路由器TL-WR941N V5.1:救砖、MOD

    完成效果图: --- 拆芯片时需要贴上胶带,防止误伤: --- 堆锡拆除旧的flash芯片: --- 购入物品: --- 编程器刷入Breed: --- Web刷机: --- 预处理材料: --- 7 ...

  6. Ubuntu 安装 SublimeText 3

    1. 下载 $ cd ~/Downloads $ wget https://download.sublimetext.com/sublime-text_build-3083_i386.deb 2. 安 ...

  7. Qt窗口的屏幕居中显示

    QDesktopWidget *pDesk = QApplication::desktop(); login->move((pDesk->width() - login->width ...

  8. hg常用命令

    关于hg命令选项 如果你是在windows系统下,使用的是图像界面,你很可能不常用它.但是一旦你了解这些命令之后,会觉得很方便.hg有很多命令,这些命令都有一定的选项,在开始的时候,只知道用它,有时候 ...

  9. Aspen 安装

    按原安装后破解不成功后: 从下载文件夹中,找到 AspenONEV8.\Patch\-STRGXI2.zip,里面有个 STRGXI2.dll,将该文 件复制到: C:\Program Files(x ...

  10. 如何得到EF(ADO.NET Entity Framework)查询生成的SQL? ToTraceString Database.Log

    ADO.NET Entity Framework ToTraceString  //输出单条查询 DbContext.Database.Log  //这里有详细的日志