Java企业级应用,根据英文字母顺序显示人员名称列表

1,637 阅读4分钟

​​本文源自Recently祝祝,创自Recently祝祝。转载请标注出处。

说明

在写系统软件的时候,写接口的时候,经常会遇到需要按照英文字母顺序表的顺序显示人员名称列表,显示人员名称只是其中一种应用方式,还有其他的应用,例如:根据字母顺序表显示商品名称,显示商品列表、根据字母顺序表显示报告列表等,例如下图所示

image.png

基本操作展示

  1. 根据值所需要的内容定义一个DTO,用来存储数据,并且定义index,用来显示字母顺序。
  2. 查询出所有的数据,外层循环26个字母,内层循环数据
  3. 程序首先在循环中输出26个小写字母,然后对于每个字母,查找所有业务名称以该字母开头的数据,并将它们存储在一个列表中。
  4. 使用“PinyinHepler”将人员名称转化为拼音字符串
  5. 一个字母数据遍历完之后已经存储到列表中的数据,需要从总表中移除,再遍历下一个字母

代码展示

基本逻辑代码

遍历循环,两个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>