Java实现根据拼音首字母的排序

news2024/10/2 16:24:16

1.项目 手机APP端要对企业列表按企业名称首字母(如果企业名是英文的就按)进行分类排序,效果如下:


2.实现过程
2.1 首先引入项目的pinyin4j-2.5.0.jar包。

这个jar的下载地址如下:
链接:https://pan.baidu.com/s/1hkP_gGAYcgzyK_Dyg2ACjw 
提取码:pu7u
在工程根目录下新建libs目录,然后将下载的jar包放到此目录下,然后引入进来(存在目录层级证明引进来了)。

pom文件中要加入一下,否则 在打包时,不能把pinyin4j-2.5.0.jar编入到项目的jar包内。
<dependency>
    <groupId>pinyin4j</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/pinyin4j-2.5.0.jar</systemPath>
</dependency>
<dependency>
systemPath这个标签的意思时,指定jar的原始路径,这个jar不是引用的本地maven仓库中的。而是从我们项目里的lib目录下引用的。

 代码如下:
企业信息实体类:CustCompany 

package cn.com.yuanquanyun.client.dto;
import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;
import java.util.List;

/**
 * 企业基本信息对象 cust_company
 * 
 * @author admin
 * @date 2021-10-29
 */
public class CustCompany implements Serializable
    private static final long serialVersionUID = 1L;

	    /** 组织机构名称 */
    private String companyName;

    /** 组织结构代码 */
    private String companyNo;

	 public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public String getCompanyNo() {
        return companyNo;
    }

    public void setCompanyNo(String companyNo) {
        this.companyNo = companyNo;
    }

}

 工具类:
 

package cn.com.yuanquanyun.utils;

import cn.com.yuanquanyun.client.dto.CustCompany;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
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.exception.BadHanyuPinyinOutputFormatCombination;

import java.text.Collator;
import java.util.*;

/**
 * 中文转拼音工具类
 */
@Slf4j
public class PinyinUtils {
    /**
     * 获取汉字串拼音,英文字符不变
     */
    public static String getFullSpell(String chinese) {
        StringBuffer pybf = new StringBuffer();
        char[] arr = chinese.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > 128) {
                try {
                    pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    log.error("toHanyuPinyinStringArray_error:"+e.getMessage());
                }
            } else {
                pybf.append(arr[i]);
            }
        }
        return pybf.toString();
    }

    /**
     * 将集合数据按照汉字首字母分组排序
     */
    public static List<Map<String, Object>> screenManufacturer(List<CustCompany> list) {
        try {
            Collator com = Collator.getInstance(java.util.Locale.CHINA);
            // 按字母排序
            //Collections.sort(list, com);
            // 输出26个字母
            List<Map<String, Object>> mapList = new ArrayList<>();
            for (int i = 1; i < 27; i++) {
                Map<String, Object> map = new TreeMap<>();
                String word = String.valueOf((char)(96 + i)).toUpperCase();
                // 循环找出 首字母一样的数据
                List<CustCompany> letter = new ArrayList<>();
                for (Iterator<CustCompany>  iter = list.listIterator(); iter.hasNext();) {
                    CustCompany custCompany = iter.next();
                    try{
                        String pybf = getFullSpell(custCompany.getCompanyName());
                        String zm = pybf.substring(0, 1);
                        if (word.equals(zm.toUpperCase())) {
                            letter.add(custCompany);
                            iter.remove();
                        }
                    }catch(Exception ex){
                        log.error(custCompany.getCompanyName()+"调取getFullSpell=="+ex.getMessage());
                        iter.remove();
                    }

                }
                map.put("letter",word);
                map.put("data", letter);
                mapList.add(map);
            }
            return mapList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        List<CustCompany> list = new ArrayList<>();

        CustCompany custCompany = new CustCompany();
        custCompany.setCompanyName("中国电信");
        custCompany.setCompanyNo("01928373");

        CustCompany custCompany1 = new CustCompany();
        custCompany1.setCompanyName("天津卫视");
        custCompany1.setCompanyNo("01928374");

        CustCompany custCompany2 = new CustCompany();
        custCompany2.setCompanyName("天津电信");
        custCompany2.setCompanyNo("01928375");

        list.add(custCompany1);
        list.add(custCompany);
        list.add(custCompany2);
        List<Map<String, Object>> maps = screenManufacturer(list);
        //设置为true时,会以格式化后的形式打印出来,方便查看
        System.out.println( JSONObject.toJSONString(maps, true));

    }
}

效果如下:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨链桥:Web3黑客必争之地

跨链桥&#xff0c;区块链的基础设施之一&#xff0c;所实现的功能是允许用户将自己的资产从一条链转移至另外一条链上&#xff0c;是连接不同的区块链的关键桥梁&#xff0c;常使用中心化的方式进行实现。由于跨链桥自身往往存储有用户所质押的巨额资产&#xff0c;是Web3黑客…

KUKA KR C4机器人与S7-1200PLC进行PROFINET通信的具体方法和步骤

KUKA KR C4机器人与S7-1200PLC进行PROFINET通信的具体方法和步骤 首先,从KUKA机器人控制柜中将KOP备选软件包拷贝出来,然后在“WorkVisual Development Environment”安装KUKA备选软件包(版本非常重要,尽量从控制柜中拷贝), 也可以从以下链接中获取: KUKA机器人PROFINET…

php 任务调度

在日常开发中&#xff0c;我们总会遇到一些在某个指定的时刻去执行&#xff0c;或是每隔xx时间执行&#xff0c;或是需要一直在后台监听的任务执行。基于这个需求&#xff0c;对于php我找了一些办法来实现这些功能 1、依赖于laravel的任务调度。 每隔xx时间执行一次命令&#…

七、虚拟机栈

虚拟机栈出现的背景 1.由于跨平台性的设计&#xff0c;Java的指令都是根据栈来设计的&#xff0c;不同平台CPU架构不同&#xff0c;所以不能设计为基于寄存器的。 2.优点是跨平台&#xff0c;指令集小&#xff0c;编译器容易实现&#xff0c;缺点是性能下降&#xff0c;实现同…

XC7K70T-1FBG676I【FPGA】XC3S200-4FTG256C参数XC7K70T-2FBG676C

Kintex-7 FPGA为快速增长应用和无线通信提供最优性价比和低功耗。Kintex-7 FPGA允许设计人员构建卓越带宽和12位数字可编程模拟&#xff0c;同时满足成本和功耗要求。Kintex-7内置支持8通道PCI Express (Gen1/Gen2)&#xff0c;用于连接主机系统。7系列器件利用Xilinx统一架构保…

如何实现外网跨网远程控制内网计算机?快解析来解决

远程控制&#xff0c;是指管理人员在异地通过计算机网络异地拨号或双方都接入Internet等手段&#xff0c;连通需被控制的计算机&#xff0c;将被控计算机的桌面环境显示到自己的计算机上&#xff0c;通过本地计算机对远方计算机进行配置、软件安装程序、修改等工作。通俗来讲&a…

超图软件许可过期后的处理

超图软件许可过期&#xff0c;博主犯了一个很低级的错误&#xff0c;特此发帖记录一下。 按照官网的介绍&#xff0c;直接申请新的许可&#xff0c;配置本地许可很简单的。 1.打开桌面软件会弹出以下的框。 2.配置本地许可对话框 3.切换到激活更新页面 4.选择激活文件即可 以…

内容团队如何快速出稿

对于内容团队而言&#xff0c;每个内容选题就相当于一个小项目&#xff0c;它们并非简单的线性工作流&#xff0c;相反其复杂程度不亚于一个小型工厂。一个内容选题会涉及内容形式&#xff0c;选题类型等多个变量&#xff0c;这些变量因素组合起来就是十几种不同类型的工作流。…

我花6个月从0开始面上大厂自动化测试岗,拿个20K不过分吧?

我是着急忙慌的准备简历——3年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f; 3年测试经验起码能要个20K吧&#xff1f;” 我一个朋友跟我说&#xff1a; “我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;…

03--框架基础

1、目录结构1&#xff09;创建项目使用测试号或小程序申请成功之后的appid即可&#xff0c;注意这里选择“不使用云服务”&#xff0c;选择javascript模板工具结构如图目录结构小程序包含一个描述整体程序的 app 和多个描述各自页面的 page。一个小程序主体部分由三个文件组成&…

python自学之《21天学通Python》(13)——第16章 数据库编程

数据库指的是以一定方式存储在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。而我们平时所说的数据库实际上是包含了数据库管理系统&#xff08;DBMS&#xff09;的&#xff0c;数据库管理系统是为管理数据库而设计的软件系统&#xff0c;它一…

jvm调优参数配置

在JVM启动参数中&#xff0c;可以设置跟内存、垃圾回收相关的一些参数设置&#xff0c;默认情况不做任何设置JVM会工作的很好&#xff0c;但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标&#xff1a; GC的时间足够的小 GC的…

Homekit智能家居DIY一WIFI智能插座

WiFi智能插座对于新手接触智能家居产品更加友好&#xff0c;不需要额外购买网关设备 很多智能小配件也给我们得生活带来极大的便捷&#xff0c;智能插座就是其中之一&#xff0c;比如外出忘记关空调&#xff0c;可以拿起手机远程关闭。 简单说就是&#xff1a;插座可以连接wi…

如何外网登录管理云通信短信网关平台?——快解析映射方案

云通信&#xff08;Cloud Communications &#xff09;是基于云计算商业模式应用的通信平台服务&#xff0c;简单易用,满足企业一键群发场景,支持多种语言SDK和API 接入。各个通信平台软件都集中在云端&#xff0c;且互通兼容&#xff0c;用户只要登录云通信平台&#xff0c;不…

【玩家心得】Smurf Society 游戏攻略

在深林的深处&#xff0c;生活着一群无忧无虑、快乐的小精灵&#xff0c;浑身蓝色&#xff0c;叫做蓝精灵。蓝精灵住在自己村子里蘑菇屋里&#xff0c;精灵爸爸、精灵妹妹、笨笨、乐乐等使得精灵村每天都欢声笑语。可是&#xff0c;在森林深处的城堡里住着一个邪恶的巫师格格巫…

量化择时——资金流择时策略(第1部分—因子测算)

文章目录资金流模型概述资金流模型的有效性逻辑资金流向指标MFI&#xff08;Money Flow Index&#xff09;MFI指标测算测算规则测算结论资金流模型概述 通常&#xff0c;资金流是一种反映股票供给信息的指标&#xff0c;宏观上来讲&#xff0c;我们知道一个道理&#xff1a;僧…

仅花半年时间,他从外包月薪5K到阿里月薪15K,究竟经历了什么?

背景介绍&#xff1a;“渣渣”二本&#xff0c;95年Java程序员**外包类型&#xff1a;**传统外包公司**内容简介&#xff1a;**朋友从一个传统公司是如何修仙到阿里巴巴&#xff1f;分享一些他的真实经历&#xff0c;希望对你有帮助。**学习路线&#xff1a;**基础&#xff08;…

电阻串联的作用

电阻串联常见作用 第一个作用是&#xff1a;阻抗匹配&#xff1a; 因为信号源的阻抗很低&#xff0c;跟信号线之间阻抗不匹配&#xff0c;串上一个电阻后&#xff0c;可以改善匹配情况&#xff0c;以减少反射&#xff0c;避免振荡等。 常见的阻抗匹配方法 1、使用变压器来做…

(十)、kityminder支持富文本的编辑

前段时间&#xff0c;去试用了下processon 上的脑图功能&#xff0c;发现人家这块确实已经做的好强大了。而且他的节点竟然还可以支持单独某个文本的颜色字体的设置&#xff0c;这个可是连xmind&#xff0c;本身都没有实现的功能的。所以想着学习下人家的实现看看是否能够借鉴到…

会声会影2023电脑版下载及系统配置要求

平时大家可能会经常听到有人说会声会影&#xff0c;但是很多人都不知道这是什么软件。其实听它的名字就知道这是一款和声音、影像有关系的软件。下面&#xff0c;小编就来给大家具体介绍一下这款软件吧。 会声会影是一套操作简单的DV、HDV影片剪辑软件。会声会影不仅完全符合家…