@@ -0,0 +1,54 @@
|
||||
package com.yunhai.acaclassassign.service.assign;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 姓名同音判定:内置常用同音字组(姓氏 + 名字常用字)。
|
||||
* <p>同组内任意字视为同音。soundKey 将姓名逐字映射为组代表字/原字后拼接。</p>
|
||||
*/
|
||||
public final class SameSound {
|
||||
|
||||
private SameSound() {
|
||||
}
|
||||
|
||||
/** 同音字组(移植自分班原型 45 组常用同音字表) */
|
||||
private static final String[] GROUPS = {
|
||||
"张章彰樟", "李理莉鲤里", "王旺望", "刘留流榴", "陈晨尘辰橙",
|
||||
"杨扬洋阳羊", "黄煌凰皇", "赵兆照罩", "吴梧吾无芜", "徐绪储",
|
||||
"孙损笋", "马玛码", "朱珠株珠诸", "胡湖糊蝴狐", "郭锅国帼",
|
||||
"何合河荷和", "高膏糕羔", "林淋琳霖麟", "罗锣萝箩络", "郑正证政挣",
|
||||
"梁粱良凉", "谢卸蟹泄", "宋送诵颂", "唐糖塘堂棠", "许序絮绪",
|
||||
"韩含寒涵涵函", "冯逢缝凤", "邓灯登等", "曹槽草漕", "彭澎蓬鹏棚",
|
||||
"曾增憎", "肖削消宵萧潇霄", "田填甜佃", "董懂冬", "袁元园原源圆员",
|
||||
"蔡菜采彩", "蒋桨讲奖", "余鱼渔愉于娱俞豫", "杜肚度渡镀", "叶页夜业",
|
||||
"程成城诚呈橙乘", "苏酥俗", "魏位未卫味畏", "吕铝侣旅履", "丁钉叮盯叮宁"
|
||||
};
|
||||
|
||||
private static final Map<Character, Character> CHAR_TO_REP = new HashMap<>();
|
||||
|
||||
static {
|
||||
for (String group : GROUPS) {
|
||||
final char rep = group.charAt(0);
|
||||
for (char c : group.toCharArray()) {
|
||||
CHAR_TO_REP.putIfAbsent(c, rep);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 姓名同音键:逐字映射同音组代表字后拼接。
|
||||
*/
|
||||
public static String soundKey(String name) {
|
||||
if (name == null) {
|
||||
return "";
|
||||
}
|
||||
final String trimmed = name.trim();
|
||||
final StringBuilder sb = new StringBuilder(trimmed.length());
|
||||
for (int i = 0; i < trimmed.length(); i++) {
|
||||
final Character rep = CHAR_TO_REP.get(trimmed.charAt(i));
|
||||
sb.append(rep == null ? trimmed.charAt(i) : rep.charValue());
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user