根据中文名称首字母进行分组

很多项目中,需要用到中文名称到首字母进行分组,例如:城市、游戏等等。。。

java 复制代码
    /**
     * 将集合数据按照汉字首字母分组排序
     *
     * @param list
     * @return
     */
    public Map<String, Object> screenManufacturer(List<Game> list) {
        Set<String> hasAddedNameSet = new HashSet<>();
        long start = System.currentTimeMillis();
        try {
            // 输出26个字母
            Map<String, Object> map = new TreeMap<>();
            int n = 0;
            for (int i = 1; i < 27; i++) {
                String word = String.valueOf((char) (96 + i)).toUpperCase();
                // 循环找出 首字母一样的数据
                List<Game> letter = new ArrayList<>();
                for (Iterator<Game> iter = list.listIterator(); iter.hasNext(); ) {
                    Game game = iter.next();
                    if (hasAddedNameSet.contains(game.getName())) {
                        continue;
                    }
                    String pybf = PinyinUtil.getFullSpell(game.getName());
                    String firstWord = pybf.substring(0, 1);
                    if (word.equalsIgnoreCase(firstWord)) {
                        hasAddedNameSet.add(game.getName());
                        letter.add(game);
                    }
                    n++;
                }
                map.put(word, letter);
            }
            log.info("总共循坏了{}次", n);
            long end = System.currentTimeMillis();
            log.info("总耗时:{}毫秒", end - start);
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
java 复制代码
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.*;

public class PinyinUtil {

    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("张三");
        names.add("李四");
        names.add("王武");
        names.add("刘德华");
        names.add("精舍蓝军");
        Map<String, Object> stringObjectMap = screenManufacturer(names);
        System.out.println(stringObjectMap);

    }


    /**
     * 获取汉字串拼音,英文字符不变
     */
    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) {
                    e.printStackTrace();
                }
            } else {
                pybf.append(arr[i]);
            }
        }
        return pybf.toString();
    }

    /**
     * 将集合数据按照汉字首字母分组排序
     */
    public static Map<String, Object> screenManufacturer(List<String> list) {
        try {
            Collator com = Collator.getInstance(Locale.CHINA);
            // 按字母排序
            Collections.sort(list, com);
            // 输出26个字母
            Map<String, Object> map = new TreeMap<>();
            for (int i = 1; i < 27; i++) {
                String word = String.valueOf((char) (96 + i)).toUpperCase();
                // 循环找出 首字母一样的数据
                List<String> letter = new ArrayList<>();
                for (String str : list) {
                    String pybf = getFullSpell(str);
                    String zm = pybf.substring(0, 1);
                    if (word.equals(zm)) {
                        letter.add(str);
                    }
                }
                map.put(word, letter);
            }
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

POM文件

java 复制代码
  <!--拼音-->
        <dependency>
            <groupId>com.belerweb</groupId>
            <artifactId>pinyin4j</artifactId>
            <version>2.5.0</version>
        </dependency>

生成的效果

java 复制代码
{
  "code": 200,
  "message": "操作成功",
  "data": {
    "A": [],
    "B": [],
    "C": [
      {
        "gameId": "g123",
        "name": "CS"
      }
    ],
    "D": [
      {
        "gameId": "g123",
        "name": "地下城勇士"
      },
      {
        "gameId": "g123",
        "name": "DNF"
      },
      {
        "gameId": "g123",
        "name": "DOTA"
      }
    ],
    "E": [],
    "F": [],
    "G": [],
    "H": [],
    "I": [],
    "J": [],
    "K": [],
    "L": [],
    "M": [
      {
        "gameId": "g123",
        "name": "魔兽世界"
      }
    ],
    "N": [],
    "O": [],
    "P": [],
    "Q": [],
    "R": [],
    "S": [
      {
        "gameId": "g123",
        "name": "守卫剑阁"
      }
    ],
    "T": [
      {
        "gameId": "7fbf48bb3204",
        "name": "test22"
      }
    ],
    "U": [],
    "V": [],
    "W": [
      {
        "gameId": "g123",
        "name": "王者荣耀"
      }
    ],
    "X": [],
    "Y": [],
    "Z": [
      {
        "gameId": "g123",
        "name": "诛仙"
      }
    ]
  }
}
相关推荐
云雀衔光8 分钟前
MCP 协议全景:为什么它是 AI 连接工具的「USB-C」
java·开发语言·数据库·人工智能·ai编程
ly768912 分钟前
Spring 异步编程的隐藏风险:@Async 线程池耗尽与异常处理详解
java·后端·spring·异常处理·线程池·任务拒绝
用户81818706274616 分钟前
第23章 热点Key问题排查与解决:大促场景经典坑
java·后端
IT枫斗者枫哥24 分钟前
Java 接口超时后,重试为什么会多建一条任务?
java
用户31268748772029 分钟前
CAS 到底是怎么保证原子性的?从 Unsafe 到 VarHandle 的演进
java
Zane199434 分钟前
线上突然OOM,你的排查顺序是先看日志还是先重启
java·后端
君顾11 小时前
折扣卡 CPS 小程序定制:从业务流程到系统架构的实践指南
java·开发语言·折扣卡
见不散1 小时前
GPT-5.6 Luna (Batch) 批量处理能力深度评测
java·gpt·batch
计算机毕设定制辅导-无忧学长1 小时前
《基于SpringBoot的庭院玫瑰栽培养护知识交互式科普平台设计与实现》
java·spring boot·后端·毕业设计·个性化推荐·协同过滤算法·庭院玫瑰栽培养护知识科普平台
Json____2 小时前
从零构建家政服务平台:一套全栈架构如何打通管理端与移动端-java-springboot
java·spring boot·后端·架构·毕设·wwwoop.com