本文源自Recently祝祝,创自Recently祝祝。转载请标注出处。
说明
在写系统软件的时候,写接口的时候,经常会遇到需要按照英文字母顺序表的顺序显示人员名称列表,显示人员名称只是其中一种应用方式,还有其他的应用,例如:根据字母顺序表显示商品名称,显示商品列表、根据字母顺序表显示报告列表等,例如下图所示
基本操作展示
- 根据值所需要的内容定义一个DTO,用来存储数据,并且定义index,用来显示字母顺序。
- 查询出所有的数据,外层循环26个字母,内层循环数据
- 程序首先在循环中输出26个小写字母,然后对于每个字母,查找所有业务名称以该字母开头的数据,并将它们存储在一个列表中。
- 使用“PinyinHepler”将人员名称转化为拼音字符串
- 一个字母数据遍历完之后已经存储到列表中的数据,需要从总表中移除,再遍历下一个字母
代码展示
基本逻辑代码
遍历循环,两个for循环构成了总体逻辑,最后将数据存入列表中,进入下一次循环。
//按照字母分组
for (int i = 1; i <= 26; i++) {
//输出26个小写字母97-122
String word = String.valueOf((char) (96 + i)).toUpperCase();
//循环找出首字母一样的数据
List<BussinessAllListDTO> list = new ArrayList<BussinessAllListDTO>();
String reg = "[a-zA-Z]*";
char c;
for (BussinessAllListDTO str : bussinessAllListDTOList) {
if (str.getBussinessName() != null) {
String s = str.getBussinessName().substring(0,1);
//判断是否为英文
if (s.matches(reg)) {
c = s.charAt(0);
} else {
//判断是否为汉字
c = PinyinHelper.toHanyuPinyinStringArray(s.charAt(0))[0].charAt(0);
}
String strs = String.valueOf(c);
String se = strs.toUpperCase();
if (word.equals(se)) {
list.add(str);
}
}
}
//数据存储后在总列表中移除已经保存到分列表里边的数据
if (list.size() > 0) {
for (BussinessAllListDTO bussinessAllListDTO : list) {
bussinessAllListDTOList.remove(bussinessAllListDTO);
}
BussinessMapAllDTO bussinessMapAllDTO = new BussinessMapAllDTO();
bussinessMapAllDTO.setChildren(list);
bussinessMapAllDTO.setIndex(word);
nums = nums + list.size();
getAllBussiness.add(bussinessMapAllDTO);
}
}
这段代码使用了两个循环嵌套。外层循环是一个 for 循环,循环遍历字母表中的所有字母,即26个小写字母。内层循环是一个 for-each 循环,用于遍历业务名称列表 bussinessAllListDTOList 中的所有业务名称。
对于每个业务名称,程序首先检查其是否为 null。如果业务名称不为 null,则程序使用 substring() 方法获取其第一个字符。然后,程序检查该字符是否为英文字符,如果是,将其存储在变量 c 中,否则使用 PinyinHelper.toHanyuPinyinStringArray() 方法将其转换为拼音字符串,并将字符串的第一个字符存储在 c 中。接下来,程序将 c 转换为一个字符串,并将其转换为大写形式。最后,程序检查当前的字母是否与字符串 se 相同,如果相同,将该业务名称加入到列表 list 中。
BussinessMapAllDTO
根据每个字母需要显示的数据可能有多个,所以将数据存放的属性定义为List,属性index用来存放字母。这样前台可以获取返回的数据进行数据展示。
@Data
public class BussinessMapAllDTO implements Serializable {
private List<BussinessAllListDTO> children;
private String index;
}
BussinessAllListDTO
定义自己所需要显示的数据,存储在DTO里边
@Data
@ApiModel(value = "业务员List")
public class BussinessAllListDTO implements Serializable {
@ApiModelProperty(value = "业务人员Id")
private String bussinessId;
@ApiModelProperty(value = "名称")
private Integer name;
}
知识点解释
PinyinHelper类
PintyinHelper是一个java类,用来将中文转化成一个拼音字符串,一个汉字可能有多个拼音,所以输出的是一个数组字符串
源码展示
static public String[] toHanyuPinyinStringArray(char ch) {
return getUnformattedHanyuPinyinStringArray(ch);
}
PinyinHelper 类的主要方法包括:
toPinyinString(String str, String separator, PinyinFormat format):将字符串中的汉字转换为拼音字符串,可指定拼音之间的分隔符和拼音格式。toPinyinStringArray(char c):将指定的汉字转换为拼音字符串数组,返回的是一个包含多个字符串的数组,每个字符串都是该汉字的一种发音。toTongyongPinyinStringArray(char c):将指定的汉字转换为通用拼音字符串数组,返回的是一个包含多个字符串的数组,每个字符串都是该汉字的一种通用发音。toMPS2PinyinStringArray(char c):将指定的汉字转换为国语拼音字符串数组,返回的是一个包含多个字符串的数组,每个字符串都是该汉字的一种国语发音。toGwoyeuRomatzyhString(char c):将指定的汉字转换为国语拼音的 Gwoyeu Romatzyh 形式,返回的是一个字符串,该字符串表示该汉字的 Gwoyeu Romatzyh 形式。toHanyuPinyinStringArray(char c):将指定的汉字转换为汉语拼音字符串数组,返回的是一个包含多个字符串的数组,每个字符串都是该汉字的一种汉语拼音发音。
这些方法中,toPinyinString() 方法最为常用,它可以将一个包含汉字的字符串转换为拼音字符串,并指定拼音之间的分隔符和拼音格式。toPinyinStringArray() 方法可以将一个汉字转换为多个不同的拼音字符串,而 toHanyuPinyinStringArray() 方法则可以将一个汉字转换为多个不同的汉语拼音字符串。其他方法则可以将汉字转换为不同格式的拼音字符串。
类的引入
import com.github.promeg.pinyinhelper.PinyinHelper;
maven
maven目前使用的都是2.5.1版本,你也可以直接将版本直接写入dependency中
<properties>
<pinyin4j.version>2.5.1</pinyin4j.version>
</properties>
<dependencies>
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>${pinyin4j.version}</version>
</dependency>
</dependencies>