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

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

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": "诛仙"
      }
    ]
  }
}
相关推荐
艾伦~耶格尔4 小时前
【数据结构进阶】
java·开发语言·数据结构·学习·面试
爪洼传承人4 小时前
18- 网络编程
java·网络编程
smileNicky4 小时前
SpringBoot系列之从繁琐配置到一键启动之旅
java·spring boot·后端
祈祷苍天赐我java之术4 小时前
Java 迭代器(Iterator)详解
java·开发语言
David爱编程5 小时前
为什么必须学并发编程?一文带你看懂从单线程到多线程的演进史
java·后端
我命由我123455 小时前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
long3165 小时前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
摇滚侠5 小时前
HTML <iframe> 标签 如何把html写入iframe标签
java
云间月13146 小时前
飞算JavaAI:从智能调度到出行服务的全链路技术升级
java·redis·飞算javaai炫技赛
不太可爱的叶某人8 小时前
【学习笔记】Java并发编程的艺术——第6章 Java并发容器和框架
java·笔记·学习