java根据拼音搜索,但数据库为汉字的解决方案
本帖最后由 苏紫方璇 于 2019-10-23 20:17 编辑最近公司有一个需求,需要进行拼音搜索,但是数据库全是中文,如果在在数据库添加拼音字段的话,工作量会特别大,所以我根据网上的大神给的方法,自己做了一个解决方案,给各位同行做个参考,本人菜鸟,欢迎多多指教{:1_893:}
以下为代码:
**1.以下代码是一个文字转拼音的工具类**
import org.springframework.stereotype.Component;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
* pinyin4j汉字转拼音工具类
* @AuThor zhiheng
*
*/
@Component
public class ChangeToPinYin {
//pinyin4j格式类
private HanyuPinyinOutputFormat format = null;
//拼音字符串数组
private String[]pinyin;
//通过构造方法进行初始化
public ChangeToPinYin(){
format = new HanyuPinyinOutputFormat();
/*
* 设置需要转换的拼音格式
* 以天为例
* HanyuPinyinToneType.WITHOUT_TONE 转换为tian
* HanyuPinyinToneType.WITH_TONE_MARK 转换为tian1
* HanyuPinyinVCharType.WITH_U_UNICODE 转换为tiān
*
*/
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
pinyin = null;
}
/**
* 对单个字进行转换
* @Param pinYinStr 需转换的汉字字符串
* @Return 拼音字符串数组
*/
public String getCharPinYin(char pinYinStr){
try
{
//执行转换
pinyin = PinyinHelper.toHanyuPinyinStringArray(pinYinStr, format);
} catch (BadHanyuPinyinOutputFormatCombination e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
//pinyin4j规则,当转换的符串不是汉字,就返回null
if(pinyin == null){
return null;
}
//多音字会返回一个多音字拼音的数组,pinyiin4j并不能有效判断该字的读音
return pinyin;
}
/**
* 对单个字进行转换
* @param pinYinStr
* @return
*/
public String getStringPinYin(String pinYinStr){
StringBuffer sb = new StringBuffer();
String tempStr = null;
//循环字符串
for(int i = 0; i<pinYinStr.length(); i++)
{
tempStr = this.getCharPinYin(pinYinStr.charAt(i));
if(tempStr == null)
{
//非汉字直接拼接
sb.append(pinYinStr.charAt(i));
}
else
{
sb.append(tempStr);
}
}
return sb.toString();
}
}
**2.以下为测试类,**
//查询数据库
List<User> list=us.getAll(village);
//new一个汉字转拼音的工具类
ChangeToPinYin changeToPinYin = new ChangeToPinYin();
//创建一个新的集合,来装符合查询的对象
List<User> list1=new ArrayList<User>();
//循环遍历
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).getName());
System.out.println(changeToPinYin.getStringPinYin(list.get(i).getName()));
//把汉字转为拼音
String p=changeToPinYin.getStringPinYin(list.get(i).getName());
// boolean res=p.toLowerCase().contains(name.toLowerCase());
//查看是否包含所查询的字符串
boolean res=p.contains(name);
System.out.println(res);
//如果包含,
if(res==true){
//装入新的lsit集合
list1.add(list.get(i));
}
}
}
代码结束;
希望帮助到大家 学到了,谢谢楼主 帮你套了一个代码框 这方法好,我用的是添加拼音字段. 1.shui 发表于 2019-10-29 10:17
这方法好,我用的是添加拼音字段.
主要是数据库已经好了突然来这个需求,在一个一个写就不现实了:lol nice 啊,感谢分享 优秀如你! 可以可以,先收藏到时候需要可以用的上。
页:
[1]