`
disneys
  • 浏览: 1991 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

解决extremeComponents中文按拼音排序问题

阅读更多

文章借鉴以下文章:

pinyin4j项目:http://pinyin4j.sourceforge.net/

extremeComponents排序实现不区分大小:http://www.blogjava.net/fastzch/archive/2006/04/07/39918.html

Java中文排序完美新解:http://blog.csdn.net/dada9407/article/details/2975622

 

向工程中加入pinyin4j-2.5.0.jar(文末提供pinyin4j-2.5.0.jar和pinyin4j-2.5.0.zip)。

把pinyin4j-2.5.0.jar拷入WebRoot/WEB-INF/lib,并添加到classpath。

 

在jsp页面标签中需指明排序所用的接口:sortRowsCallback="com.heer.MySortCallback"

 

	<ec:table 
		tableId="statList"
		retrieveRowsCallback="limit"
		filterRowsCallback="limit"

		var="result"
		items="resultList"
		action="${pageContext.request.contextPath}/stat.do?method=${actionMethod}"
		title="统计结果"
		width="100%"
		rowsDisplayed="10"
		filterable="false"
		sortRowsCallback="com.heer.MySortCallback"
		>

 

 

定义自己的Comparator类

 

package com.heer;

import java.text.Collator;
import java.util.Comparator;
import net.sourceforge.pinyin4j.PinyinHelper;
import org.apache.commons.collections.comparators.NullComparator;

public class MyComparator extends NullComparator {

	Collator collator = Collator.getInstance();

	public int compare(Object o1, Object o2) {

		String key1 = o1 == null ? "" : o1.toString();
		String key2 = o2 == null ? "" : o2.toString();
		if(isNumeric(key1)&&isNumeric(key2)){
			return (int) (Double.valueOf(key1)-Double.valueOf(key2));
		}else{
			for (int i = 0; i < key1.length() && i < key2.length(); i++) {
				int codePoint1 = key1.charAt(i);
				int codePoint2 = key2.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)) {
							return pinyin1.compareTo(pinyin2);
						}
					} else {
						return codePoint1 - codePoint2;
					}
				}
			}
		}
		return key1.length() - key2.length();
	}

	private String pinyin(char c) {
		String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c);
		if (pinyins == null) {
			return null; // 如果转换结果为空,则返回null
		}
		return pinyins[0]; // 如果为多音字返回第一个音节
	}

	public static boolean isNumeric(String str) {
		int begin = 0;
		boolean once = true;
		if (str == null || str.trim().equals("")) {
			return false;
		}
		str = str.trim();
		if (str.startsWith("+") || str.startsWith("-")) {
			if (str.length() == 1) {
				// "+" "-"
				return false;
			}
			begin = 1;
		}
		for (int i = begin; i < str.length(); i++) {
			if (!Character.isDigit(str.charAt(i))) {
				if (str.charAt(i) == '.' && once) {
					// '.' can only once
					once = false;
				} else {
					return false;
				}
			}
		}
		if (str.length() == (begin + 1) && !once) {
			// "." "+." "-."
			return false;
		}
		return true;
	}
}

 

 

 实现SortRowsCallback接口

package com.heer;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ReverseComparator;
import org.extremecomponents.table.bean.Column;
import org.extremecomponents.table.callback.SortRowsCallback;
import org.extremecomponents.table.core.TableConstants;
import org.extremecomponents.table.core.TableModel;
import org.extremecomponents.table.limit.Sort;

public final class MySortCallback implements SortRowsCallback {

	public Collection sortRows(TableModel model, Collection rows)
			throws Exception {
		boolean sorted = model.getLimit().isSorted();

		if (!sorted) {
			return rows;
		}
		Sort sort = model.getLimit().getSort();
		String sortProperty = sort.getProperty();
		String sortOrder = sort.getSortOrder();
		Column column = model.getColumnHandler().getColumnByAlias(sortProperty);
		String property = column.getProperty();

		if (sortOrder.equals(TableConstants.SORT_ASC)) {
			BeanComparator comparator = new BeanComparator(property,
					new MyComparator());
			Collections.sort((List) rows, comparator);
		} else if (sortOrder.equals(TableConstants.SORT_DESC)) {
			BeanComparator reversedNaturalOrderBeanComparator = new BeanComparator(
					property, new ReverseComparator(new MyComparator()));
			Collections.sort((List) rows, reversedNaturalOrderBeanComparator);
		}

		return rows;
	}

}

 

这样常用汉字和非常用都会取汉字的汉语拼音,再按照英文字符的比较方法进行排序。

 

分享到:
评论

相关推荐

    extremeComponents中文文档

    同时,也会提供一些调试技巧和最佳实践,帮助开发者解决可能出现的问题。 通过阅读并实践"extremeComponents中文文档",开发者可以充分利用这个库的强大功能,提高开发效率,打造一流的Web应用体验。无论你是初学者...

    extremecomponents

    1. **组件配置**:了解如何在XML配置文件或Java代码中声明和配置extremecomponents的列表控件,包括设置数据源、定义列宽、设定排序规则等。 2. **数据绑定**:学习如何将后端数据模型与列表控件绑定,这可能涉及到...

    eXtremeComponents

    eXtremeComponents控件指南

    eXtremeComponents-1.0.1+中文API___分页工具

    总结起来,eXtremeComponents-1.0.1+中文API分页工具是Java Swing开发者的强大助手,它通过易用的API和实例代码,为开发者提供了便捷的分页解决方案。无论是初次接触还是经验丰富的开发者,都能从中受益,提升项目的...

    extremecomponents 中文文档.rar

    7. **错误处理与调试**:遇到问题时的排查方法,常见错误的解决方案,以及如何进行有效的调试。 8. **兼容性和浏览器支持**:文档会指出 Extreme Components 对不同浏览器的支持情况,包括IE、Firefox、Chrome、...

    eXtremeComponents详解

    2. **调试器**: 内置的EC专用调试工具,便于定位和解决问题。 3. **模板与示例**: 提供多种预设模板和示例项目,加速开发进程。 ### 四、eXtremeComponents使用技巧 1. **性能优化**: 使用缓存策略和懒加载机制,...

    eXtremeComponents组件

    "extreme 列表组件"是eXtremeComponents中的核心部分,它通常指的是能够高效处理大量数据,并提供动态排序、筛选、分页等功能的列表视图。这类组件对于数据密集型应用,如数据分析工具、数据库管理软件或者任何需要...

    eXtremeComponents详尽文档包

    此外,文档通常还会包含故障排除指南和常见问题解答,帮助开发者解决在使用过程中遇到的问题。 总之,eXtremeComponents详尽文档包是学习和精通EC组件的宝贵资源,它提供了一条从新手到熟练开发者的学习路径。通过...

    extremeComponents开发指南

    extremeComponents开发指南,快速掌握extremeComponents开发

    extremecomponents 包

    extremecomponents 包

    eXtremeComponents介绍

    **eXtremeComponents介绍** eXtremeComponents(简称EC)是一套强大的Java组件库,主要用于构建企业级的Web应用程序。它以其高效、灵活和高度可定制的特点,在开发社区中受到广泛的关注。EC旨在提高开发人员的工作...

    extremecomponents 中文文档

    7. **问题解决**:提供常见问题的解决方案,帮助开发者在遇到问题时迅速找到解决办法,提高开发效率。 8. **最佳实践**:分享一些使用 ExtremeComponents 的最佳实践,比如组件组合使用、代码结构规划等,以提升...

    eXtremeComponents-1.0.3

    同时,社区支持和技术文档也是评估组件库价值的重要部分,它们可以帮助开发者解决在使用过程中遇到的问题。 总的来说,eXtremeComponents-1.0.3是一个值得信赖的开发工具集,它能够简化开发过程,提升开发效率,...

    eXtremeComponents-1.0.4.zip

    《深入理解eXtremeComponents:打造高效JSP表格展示》 在Web开发领域,高效地展示数据是一项至关重要的任务,特别是在使用Java Server Pages (JSP) 的项目中。eXtremeComponents 是一个功能强大的组件库,尤其以其...

    eXtremeComponents1.0.1.jar

    eXtremeComponents1.0.1.jar

    eXtremeComponents 源代码

    【eXtremeComponents 源代码】是一个与Java编程相关的资源,主要包含有源代码和.jar包。这个开源项目提供了丰富的组件集合,为开发者在构建Java应用程序时提供了便利。eXtremeComponents的设计目标是提高开发效率,...

    extremeComponents源代码

    "ExtremeComponents"是一个开源项目,其源代码包含了用于构建Web应用程序的组件库。这个库主要设计用于提高开发效率,提供了一系列高效、可定制且功能丰富的Web UI组件。这些组件通常包括表格、表单、菜单、按钮等...

    eXtremeComponents控件分页导出数据Demo.rar

    《eXtremeComponents控件分页导出数据Demo详解》 在软件开发过程中,高效的数据展示和管理是至关重要的。eXtremeComponents控件系列以其强大的功能和灵活的定制性,在.NET平台上赢得了广大开发者的一致好评。尤其是...

    eXtremeComponents-1.0.1.jar

    eXtremeComponents组件,导出Excel或pdf文件的jar包

Global site tag (gtag.js) - Google Analytics