一、需求描述
最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示:
微信:简体中文、拼音排序
微信:繁体中文、笔画排序
微信 英文 字母排序
二、实现效果
下面看看我的Demo实现的效果
简体中文、拼音排序
繁体中文、笔画排序
英文 字母排序
其他语言,显示其他语言,排序按照对应的英文名来排序
三、实现过程
在将这部分代码抽取出来,做了一个demo。项目结构如下所示:采用策略模式,分别有EnglishSortStrategy、PinyinSortStrategy、StrokeSortStrategy三种策略,分别表示英文排序策略、拼音排序策略、汉字笔画排序策略。
+ 拼音排序
通过pin4j工具类将汉字转换为拼音,然后按照拼音的字母进行排序。
+ 笔画排序
通过查找汉字笔画数据库,将每个汉字对应的笔画数、汉字、汉字对应的编码映射到map中,然后通过查询map找到每个汉字的笔画,最终按照笔画数目进行排序。
+ 英文排序
直接通过英文的字母顺序进行排序即可。
三种排序策略具体实现:
ISortStrategy.java 排序策略接口
package com.oyp.sort.strategy;
import android.content.Context;
import com.oyp.sort.adapter.CountryOrRegionAdapter;
import com.oyp.sort.bean.CountryOrRegion;
import java.util.List;
/**
* 排序的策略
*/
public interface ISortStrategy {
/**
* 获取排序过后的国家区域列表
*
* @param countryOrRegionList 待排序的国家区域列表
* @return 排序过后的国家区域列表
*/
List getSortedCountryOrRegionList(List countryOrRegionList);
/**
* 获取要展示的排序的title 拼音排序显示 首字母,笔画排序显示 几划
*
* @param countryOrRegion 封装的CountryOrRegion
* @return 要展示的排序的title
*/
String getSortTitle(CountryOrRegion countryOrRegion,Context context);
/**
* 根据ListView的当前位置获取排序标题 是否需要显示的对比值:
* - 拼音排序返回首字母的Char ascii值
* - 笔画排序返回首字母的汉字笔画数量
*
* @param list 数据List集合
* @param position 位置
* @return 是否需要显示的对比值
* - 拼音排序返回首字母的Char ascii值
* - 笔画排序返回首字母的汉字笔画数量
*/
int getSectionForPosition(List list, int position);
/**
* 获取第一次或者是最后一次 出现该排序标题的位置
*
* @param list 排序列表
* @param section 排序标题的值:拼音排序首字母的Char ascii值,笔画排序出现的笔画数
* @param isFirst 是否是第一次
* @return 第一次或者是最后一次 出现该排序标题的位置
*/