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

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

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": "诛仙"
      }
    ]
  }
}
相关推荐
张较瘦_9 分钟前
[论文阅读] 软件工程 | 告别“线程安全玄学”:基于JMM的Java类静态分析,CodeQL3分钟扫遍GitHub千仓错误
java·论文阅读·安全
A尘埃2 小时前
智慧零售全渠道业务中台系统
java·零售
小wanga5 小时前
C++知识
java·开发语言·c++
我是渣哥5 小时前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化
工一木子5 小时前
深入Java并发:锁机制原理剖析与性能优化实战
java·性能优化·并发·
你我约定有三6 小时前
java--写在 try 中的创建连接
java·开发语言
ERP老兵-冷溪虎山6 小时前
Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
java·javascript·python·golang·中医编程·四语言同步学习·职场生存指南
科技树支点6 小时前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器
码农小伙6 小时前
ConcurrentHashMap解析
java·开发语言