示例:
假设有这样的十条记录:
Id | record |
1 | A ''Healthy Schools'' program in Hong Kong: Enhancing positive health behavior for school children and teachers |
2 | 1996 opinion survey on civic education: Final report |
3 | 'A Luxury for the First World': A western perception of Hong Kong Chinese attitudes towards inclusive education |
4 | A Chinese cultural critique of the global qualifying standards for social work education |
5 | A baseline survey of students' attitudes towards gender stereotypes and family roles |
6 | 「中國文化」項目的教學與教學上的銜接 |
7 | 中國語文及文化科的組織淺探 |
8 | 「中學美術與設計科應用電子科技教學」試驗計劃 |
9 | 點滴校園:學校社會工作文集 |
10 | 齊來說故事:透過小組學習方式改善說話的表達能力及態度 |
通常意义上,我们想通过排序获得的排序结果如下:
ID | record |
1 | 1996 opinion survey on civic education: Final report |
2 | A baseline survey of students' attitudes towards gender stereotypes and family roles |
3 | A Chinese cultural critique of the global qualifying standards for social work education |
4 | A ''Healthy Schools'' program in Hong Kong: Enhancing positive health behavior for school children and teachers |
5 | 'A Luxury for the First World': A western perception of Hong Kong Chinese attitudes towards inclusive education |
6 | 點滴校園:學校社會工作文集 |
7 | 齊來說故事:透過小組學習方式改善說話的表達能力及態度 |
8 | 「中國文化」項目的教學與教學上的銜接 |
9 | 中國語文及文化科的組織淺探 |
10 | 「中學美術與設計科應用電子科技教學」試驗計劃 |
由排序结果可知,我们将数字排在最前面,然后按字母排序,再按中文拼音排序。这个排序通常是没有问题的,但由数据我们会发现几个问题:字母大小写、符点符号(特殊符号)、中英混合排序等特殊性的地方。对此,如果数据量不是成万上十万条的情况下,我们可以采取如下步骤进行处理:
1、 定义一个对象
Public class RecordInfo{
private String id;
private String record;
private String recordtemp;
//get、set方法省略……
}
2、 例如这些记录是在数据库中的,我们将之取出,以RecordInfo对象的方式存储在某一个List集合中,在存入list过程中,为了处理特殊符号,我们可以将处理过后的值set到recordtemp字段中(可以用rePlaceAll()的方法处理特殊符号)。而且加入如下代码:
Collections.sort(listtemp, new AuthorVOCompare());
这里有一个AuthorVOCompare类,这个类主要用于重排序,代码如下:
import java.util.Comparator;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.*;
@SuppressWarnings("unchecked")
public class AuthorVOCompare implements Comparator {
public int compare(Object op1, Object op2) {
RecordInfo record1 = (RecordInfo) op1;
String o1 = record1.getRecordtemp();
RecordInfo record2= (RecordInfo) op2;
String o2 = record2. getRecordtemp ();
for (int i = 0; i < o1.length() && i < o2.length(); i++) {
int codePoint1 = o1.charAt(i);
int codePoint2 = o2.charAt(i);
if (Character.isSupplementaryCodePoint(codePoint1)
|| Character.isSupplementaryCodePoint(codePoint2)) {
i++;
}
if (codePoint1 != codePoint2) {
if (Character.isSupplementaryCodePoint(codePoint1)
|| Character.isSupplementaryCodePoint(codePoint2))
{
return codePoint1 - codePoint2;
}
String pinyin1 = pinyin((char) codePoint1);
String pinyin2 = pinyin((char) codePoint2);
if (pinyin1 != null && pinyin2 != null) {
// 两个字符都是汉字
if (!pinyin1.equals(pinyin2)) {
//這一條尤為重要,如果調用的是compareTo是不忽略大小寫的
return pinyin1. compareToIgnoreCase (pinyin2);
}
} else {
return codePoint1 - codePoint2;
}
}
}
return o1.length() - o2.length();
}
/**对中英文排序**/
private String pinyin(char c) {
if (String.valueOf(c) == null || String.valueOf(c).length() == 0) {
return "";
}
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
format.setVCharType(HanyuPinyinVCharType.WITH_V);
String output = "";
try {
if (java.lang.Character.toString(c).matches("[\\u4E00-\\u9FA5]+")) {
String[] temp = PinyinHelper
.toHanyuPinyinStringArray(c, format);
if (temp != null && temp.length > 0) {
output += temp[0];
}
} else {
output += java.lang.Character.toString(c);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return output;
}
}
这个类中需要引入一个jar包:pinyin4j-2.5.0.jar,主要用于拼音的排序,可以网上下载。
ps:本文無版權,代碼部分來摘自網絡。
分享到:
相关推荐
本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法。分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序。例如: String[]...
导入jar 包 调用 String[] arr1 = new String[1]; ... 参数1 排序的集合 参数2 排序的字段(与定义字段一致) 可多个 参数3 排序方式(asc desc) 暂时只支持String 和int的排序 可能有些BUG 敬请谅解
Java相关 public static void main(String[] args) { User u1=new User(1, "zhangsan");... //放入到Set集合中 Set userset=new HashSet(); userset.add(u1); userset.add(u2); userset.add(u3);
list集合树状排序 对于前端jquery-treetable无法进行父子关联数据问题进行改进,后台传list集合前,对list进行排序,然后在返回到前台。
支持一个List按照MAP中的一个或者多个Key的value值的中英文来排序,自动识别字符和数字(包括[a-zA-z]?[0-9]*)排序
此文件搭配本人发表的文章:C#list集合按元素出现次数排序取值(含去重功能),资源完全免费下载,不收取任何费用,纯粹的技术交流。联系方式在文章中有,喜欢的朋友们可以互相交流一下。
对List集合中 对象属性排序,不需要在每个实体类中重写Sort方法,实现了代码的重用。非常好用的Util类
List<String> location=new ArrayList(); 一行代码轻松搞定混合排序问题 Collections.sort(location, new SortUtils(true));
在开发中,我们可能会遇到,我们会根据不同情况对一个List集合进行排序操作,为了方便List集合根据对象中的某一个属性进行排序,开发了此工具类:
* 对传入的list进行分组排序 * list里面数据格式 [01-01-开头.txt, 01-02-简介.jpg, 11-01-尾声.jpg, 11-03-空白.jpg, 11-04-空白2.jpg, 11-06-空白1.jpg, 11-02-答谢语.txt, 02-01-标题.jpg, 02-09-标题555.jpg, ...
对集合中的对象进行排序,例如:List中存放了User对象,则可根据User对象的某一个属性进行顺序or倒序的排序
java 集合分组排序帮助类有好的意见可以互相交流不甚感激
主要介绍了JAVA像SQL一样对List对象集合进行排序的实现方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
主要介绍了C#对list列表进行随机排序的方法,涉及C#操作list列表的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
天才之作:通过泛型,对List中对象多属性排序,支持设置各属性排序方式(动态属性),看了之后绝对让你震撼!
实现的功能:混合字符串处理 中英文排序 右侧悬浮栏 顶部名称提示栏 滚动悬浮提示,文件里放置了运行的效果图,实现的效果还是让人很满意的 我开发的环境是intellij idea, 导入到eclipse要注意处理一些问题,具体...
java集合某个字段按照中文拼音排序 java集合某个字段按照中文拼音排序
本文实例讲述了Python3实现对列表按元组指定列进行排序的方法。分享给大家供大家参考,具体如下: Python版本: python3.+ 运行环境: Mac OS IDE: pycharm Python内建的排序方法 1 排序方法介绍 Python中有2个...
由于Collections排序实际上是对字符串进行比较,然后对日期排序,但是有时候给的日期不是很规范,所以想把日期统一化, 这样用Collections进行升序排序