根据网上的相关信息结合自己的需求修改关于多音字重组的相关代码。如:比如 [a,b,c],[b],[f],[f,d] 这种数据格式,排列成: abff, abfd, bbff,bbfd,cbff,fbfd这种排列组合。
算法来自(点击打开链接)
主要的处理方法(根据自己的逻辑处理)
@Service
public class PinYinService extends BaseService<PinYin>{
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private PinYinDao pinYinDao;
/**
* @author zls
*/
public Json createpinyin(String tableName, String fieldName,String primaryKey) {
Json json=new Json();
Map<String,Object> map=new HashMap<String, Object>();
map.put("tableName", tableName);
map.put("fieldName", fieldName);
map.put("primaryKey", primaryKey);
//获取表信息
try {
List<Map<String,Object>>tablelist= pinYinDao.selectTableData(map);
for(Map<String,Object> tableMap:tablelist){
String id= tableMap.get("id").toString();
String fileName=tableMap.get("fileName").toString();
//String fileName="重庆银行解";
char[] c=fileName.toCharArray();
String simplyPinYin="";
String allPinYin="";
String[][] allparams=new String[c.length][];
String[][] simplyparams=new String[c.length][];
for(int i=0;i<c.length;i++){
//根据汉字去查拼音
List<String> pinyin=new ArrayList<String>();
if(isChinese((c[i]+""))){
pinyin=pinYinDao.selectPinYin(c[i]+"");
}else{
pinyin.add((c[i]+""));
}
String[] aa=new String[pinyin.size()];
String[] bb=new String[pinyin.size()];
for(int j=0;j<pinyin.size();j++){
allparams[i]=aa;
allparams[i][j]=pinyin.get(j);
simplyparams[i]=bb;
simplyparams[i][j]=pinyin.get(j).toCharArray()[0]+"";
}
}
String[] rsall=getPermutations(allparams);
String[] rssimply=getPermutations(simplyparams);
for (String all : rsall) {
allPinYin=allPinYin+all+",";
}
rssimply=arrayUnique(rssimply);
for (String simply : rssimply) {
simplyPinYin=simplyPinYin+simply+",";
}
Map<String,Object> paramMap=new HashMap<String, Object>();
paramMap.put("primaryKey", primaryKey);
paramMap.put("id", id);
paramMap.put("allPinYin", allPinYin.substring(0,allPinYin.length() - 1));
paramMap.put("simplyPinYin", simplyPinYin.substring(0,simplyPinYin.length() - 1));
paramMap.put("tableName", tableName);
//插入表数据简拼和全拼
pinYinDao.insertTableData(paramMap);
}
json.setMsg("创建拼音成功");
json.setState(BaseController.SUCCESS_STATE);
json.setSuccess(true);
return json;
} catch (Exception e) {
json.setMsg("系统内部错误");
json.setState(BaseController.ERROR_SYS_STATE);
json.setSuccess(false);
logger.error("【PinYinService-createpinyin-error:" + e.getMessage() + "】");
return json;
}
}
拼装组合多音字参数(不需要改变)
public static String[] getPermutations(String[][] params) {
StringBuffer buffer=new StringBuffer();
ArrayList<String> list=new ArrayList<String>();
int[] lengths=new int[params.length];
for (int i=0; i<params.length; i++) {
lengths[i]=params[i].length;
}
ArrayIndex arrayIndex=new ArrayIndex(lengths);
int[] indexs=arrayIndex.get();
do {
buffer.setLength(0);
for (int i=0; i<params.length; i++) {
buffer.append(params[i][indexs[i]]);
}
list.add(buffer.toString());
indexs=arrayIndex.next();
} while (indexs!=null);
return list.toArray(new String[list.size()]);
}
数组去重(不需要改变)
public static String[] arrayUnique(String[] a) {
Set<String> set = new HashSet<String>();
set.addAll(Arrays.asList(a));
return set.toArray(new String[0]);
}
判断是否为汉字(不需要改变)
public static boolean isChinese(String str) {
String regEx = "[\u4e00-\u9fa5]";
Pattern pat = Pattern.compile(regEx);
Matcher matcher = pat.matcher(str);
boolean flg = false;
if (matcher.find()){
flg = true;
}
return flg;
}
最后是多音字拼装工具类(不需要改变,直接用)
/**
*
* @Title ArrayIndex.java
* @Description 多音字拼装工具类
* @Author zls
*/
public class ArrayIndex {
private int index;
private int[] limits;
private int[] indexs;
public ArrayIndex(int[] limits) {
this.limits=limits;
indexs=new int[limits.length];
}
public int[] get() {
return indexs;
}
public int[] next() {
for (int i=index; i<indexs.length; i++) {
if (++indexs[i]<limits[i]) {
return indexs;
}
indexs[i]=0;
}
return null;
}
}