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

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

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": "诛仙"
      }
    ]
  }
}
相关推荐
金銀銅鐵37 分钟前
带您看懂字节码指令(一):一帧里有什么
java·后端·ai编程
nice_lcj5202 小时前
【从零理解 Spring AI · 14】RAG 的四个环节:加载、切分、向量化、检索
java·spring boot·embedding·向量数据库·rag·spring ai·ai应用开发
学长毕设4 小时前
基于springboot科创竞赛信息平台-附源码
java·spring boot·后端
聪明的笨猪猪5 小时前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
学长毕设5 小时前
基于SpringBoot公务员考试交流平台-附源码
java·spring boot·后端
SL_staff7 小时前
私有化低代码:面向强监管行业的可控数字化实践
java·低代码
三翼鸟数字化技术团队8 小时前
高性能存储引擎RocksDB:原理与Java生态实践
java
SL_staff8 小时前
JVS-APS有限产能建模的七个刚性支点:面向产线真实约束的技术实现解析
java·开源·全栈
特立独行的猫A8 小时前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
学长毕设8 小时前
基于SpringBoot的高校后勤报修管理系统-附源码
java·spring boot·后端