Java 实现汉字按照首字母分组排序

简介: Java 实现汉字按照首字母分组排序

jar 包

<!--汉字转拼音-->
<dependency>
    <groupId>com.belerweb</groupId>
    <artifactId>pinyin4j</artifactId>
    <version>2.5.1</version>
</dependency>
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.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
 * 26字母排序
 * 1、将数据list 进行排序Collections,排序后是按照汉字字母排序的
 * 2、循环找出26个字母,以字母为key,以list中相同首字母的数据为值(集合)
 * 3、需要用到 pinyin4j-2.5.0.jar 这个汉字转拼音的jar包
 */
public class AlphabeticalUtils {
    /**
     * 获取汉字串拼音,英文字符不变
     */
    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(java.util.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;
    }
    public  static void main(String[] args){
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("王五");
        list.add("B王五");
        list.add("A王五");
        list.add("三");
        list.add("阿拉伯");
        Map<String, Object> map = screenManufacturer(list);
        System.out.print(map);
    }
}
目录
相关文章
|
1天前
|
Java
Java对list集合元素进行排序的几种方式
Java对list集合元素进行排序的几种方式
10 0
|
2天前
|
Java
java 实现Comparable接口排序,升序、降序、倒叙
java 实现Comparable接口排序,升序、降序、倒叙
7 0
|
14天前
|
存储 搜索推荐 算法
Java数组全套深入探究——进阶知识阶段3、sort自然排序
Java数组全套深入探究——进阶知识阶段3、sort自然排序
8 0
|
16天前
|
算法 Java
在排序数组中查找元素的第一个和最后一个位置(Java详解)
在排序数组中查找元素的第一个和最后一个位置(Java详解)
14 0
|
20天前
|
搜索推荐 Java
JAVA排序之选择排序 带图和code
JAVA排序之选择排序 带图和code
11 0
JAVA排序之选择排序 带图和code
|
23天前
|
Java Go C++
Golang每日一练(leetDay0116) 路径交叉、回文对
Golang每日一练(leetDay0116) 路径交叉、回文对
22 0
Golang每日一练(leetDay0116) 路径交叉、回文对
|
23天前
|
Java Go 人工智能
Java每日一练(20230502) BST公共祖先、随机分组、K个一组翻转链表
Java每日一练(20230502) BST公共祖先、随机分组、K个一组翻转链表
17 0
Java每日一练(20230502) BST公共祖先、随机分组、K个一组翻转链表
|
23天前
|
C++ Java Go
Java每日一练(20230428) 搜索旋转排序数组、栈实现队列、平方根
Java每日一练(20230428) 搜索旋转排序数组、栈实现队列、平方根
31 0
Java每日一练(20230428) 搜索旋转排序数组、栈实现队列、平方根
|
23天前
|
Python Java 算法
Java每日一练(20230405) 地下城游戏、汇总区间、寻找旋转排序数组中的最小值2
Java每日一练(20230405) 地下城游戏、汇总区间、寻找旋转排序数组中的最小值2
18 0
Java每日一练(20230405) 地下城游戏、汇总区间、寻找旋转排序数组中的最小值2
|
23天前
|
Python Java Go
Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间
Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间
22 0
Java每日一练(20230403) 字母异位词分组、删除链表的倒数第 N 个结点、合并区间

热门文章

最新文章

相关产品

  • 云迁移中心