java中,中文首字母搜索是怎么实现的?
使用pinyin4j或者jpinyin的,先将汉字转换为拼音,然后记录拼音的首字母,具体的检索过程可以用循环过滤,也可以用前缀树 比如tire树
参考链接:
网页链接 java实现汉字转拼音
网页链接 tire树
获取首字母需要对汉字表和字母表进行映射,如下示例代码是以gb2312编码为入手点,进行匹配的,也可以使用gbk、utf-8等编码进行匹配,但代码就完全不同了。
示例代码如下:
public class FirstLetterUtils {
// 简体中文的编码范围从B0A1(45217)一直到F7FE(63486)
private static int BEGIN = 45217;
private static int END = 63486;
// 按照声 母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字。
// i, u, v都不做声母, 自定规则跟随前面的字母
private static char[] chartable = { '啊', '芭', '擦', '搭', '蛾', '发', '噶', '哈', '哈', '击', '喀', '垃', '妈', '拿', '哦', '啪', '期', '然', '撒', '塌', '塌', '塌', '挖', '昔', '压', '匝', };
// 二十六个字母区间对应二十七个端点
// GB2312码汉字区间十进制表示
private static int[] table = new int[27];
// 对应首字母区间表
private static char[] initialtable = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 't', 't', 'w', 'x', 'y', 'z', };
// 初始化
static {
for (int i = 0; i < 26; i++) {
table[i] = gbValue(chartable[i]);// 得到GB2312码的首字母区间端点表,十进制。
}
table[26] = END;// 区间表结尾
}
// ------------------------public方法区------------------------
// 根据一个包含汉字的字符串返回一个汉字拼音首字母的字符串 最重要的一个方法,思路如下:一个个字符读入、判断、输出
public static String cn2py(String SourceStr) {
String Result = "";
int StrLength = SourceStr.length();
int i;
try {
for (i = 0; i < StrLength; i++) {
Result += Char2Initial(SourceStr.charAt(i));
}
} catch (Exception e) {
Result = "";
e.printStackTrace();
}
return Result;
}
// ------------------------private方法区------------------------
/**
* 输入字符,得到他的声母,英文字母返回对应的大写字母,其他非简体汉字返回 '0' *
*/
private static char Char2Initial(char ch) {
// 对英文字母的处理:小写字母转换为大写,大写的直接返回
if (ch >= 'a' && ch <= 'z') {
return (char) (ch - 'a' + 'A');
}
if (ch >= 'A' && ch <= 'Z') {
return ch;
}
// 对非英文字母的处理:转化为首字母,然后判断是否在码表范围内,
// 若不是,则直接返回。
// 若是,则在码表内的进行判断。
int gb = gbValue(ch);// 汉字转换首字母
if ((gb END))// 在码表区间之前,直接返回
{
return ch;
}
int i;
for (i = 0; i < 26; i++) {// 判断匹配码表区间,匹配到就break,判断区间形如“[,)”
if ((gb >= table[i]) && (gb < table[i + 1])) {
break;
}
}
if (gb == END) {// 补上GB2312区间最右端
i = 25;
}
return initialtable[i]; // 在码表区间中,返回首字母
}
/**
* 取出汉字的编码 cn 汉字
*/
private static int gbValue(char ch) {// 将一个汉字(GB2312)转换为十进制表示。
String str = new String();
str += ch;
try {
byte[] bytes = str.getBytes("GB2312");
if (bytes.length < 2) {
return 0;
}
return (bytes[0] << 8 & 0xff00) + (bytes[1] & 0xff);
} catch (Exception e) {
return 0;
}
}
public static void main(String[] args) throws Exception {
System.out.println(cn2py("这是一个获取首字母的class"));
}
}
我做过一个公交查询系统,其中有个功能就是通过字母显示出相应的站点。
首先,你想通过‘W’得到王力宏、王菲等你就必须先把这些名字存到数据库中吧,然后你再在数据库中给这些名字项添加一个首字母的字段,当然你不用手动去输入它们的首字母,写个方法循环把它们的首字母输出并存入数据库中,方法可用楼上的音品码查询,我也写了个类似的方法,如下:
public class StringUtil {
//private static Log logger = LogFactory.getLog(StringUtil.class);
// 国标码和区位码转换常量
int GB_SP_DIFF = 160;
//存放国标一级汉字不同读音的起始区位码
int[] secPosValueList = {
1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787,
3106, 3212, 3472, 3635, 3722, 3730, 3858, 4027, 4086,
4390, 4558, 4684, 4925, 5249, 5600};
//存放国标一级汉字不同读音的起始区位码对应读音
char[] firstLetter = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'w', 'x', 'y', 'z'};
char convert(String ch) {
byte[] bytes=new byte[2];
try {
bytes = ch.getBytes("GB2312");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
char result = '-';
int secPosValue = 0;
int i;
for (i = 0; i < bytes.length; i++) {
bytes[i] -= GB_SP_DIFF;
}
secPosValue = bytes[0] * 100 + bytes[1];
for (i = 0; i < 23; i++) {
if (secPosValue >= secPosValueList[i] && secPosValue < secPosValueList[i + 1]) {
result = firstLetter[i];
break;
}
}
return result;
}
}
调用convert(String str)方法就是返回str字符串的首字的首字母。其它的应该没什么难的了,代码看不懂给我发信息。
Ajax就可以实现,然后用到模糊查询.
两种做法:
一种是在数据库中加一个字段.就是专门写入字的品音的.王力宏 wlh
还有一种是根据汉字的品音码查询"这是以前写过的一个例子.
就是从字典第一个字开始到最后一个字..但是不全,你可以查一下再..
在数据库查询时写:between xx and xx
就行了..
<div class="r1">
<a href="#" onclick="go_py('吖','八')">A</a>
<a href="#" onclick="go_py('八','嚓')">B</a>
<a href="#" onclick="go_py('嚓','咑')">C</a>
<a href="#" onclick="go_py('咑','妸')">D</a>
<a href="#" onclick="go_py('妸','发')">E</a>
<a href="#" onclick="go_py('发','旮')">F</a>
<a href="#" onclick="go_py('旮','铪')">G</a>
<a href="#" onclick="go_py('铪','鸡')">H</a>
<a href="#">I</a>
<a href="#" onclick="go_py('鸡','咔')">J</a>
<a href="#" onclick="go_py('咔','垃')">K</a>
<a href="#" onclick="go_py('垃','妈')">L</a>
<a href="#" onclick="go_py('妈','嗯')">M</a>
<a href="#" onclick="go_py('嗯','哦')">N</a>
<a href="#" onclick="go_py('哦','妑')">O</a>
<a href="#" onclick="go_py('妑','七')">P</a>
<a href="#" onclick="go_py('七','呥')">Q</a>
<a href="#" onclick="go_py('呥','仨')">R</a>
<a href="#" onclick="go_py('仨','他')">S</a>
<a href="#" onclick="go_py('他','屲')">T</a>
<a href="#">U</a>
<a href="#">V</a>
<a href="#" onclick="go_py('屲','夕')">W</a>
<a href="#" onclick="go_py('夕','丫')">X</a>
<a href="#" onclick="go_py('丫','帀')">Y</a>
<a href="#" onclick="go_py('帀','坐')">Z</a>
</div>
ava头盔是哪个国家的?
AVA创始人郭大路。在上海XMEETING期间,郭大路表示:在国内我们不仅要做最好的产品,同时我们也要把品牌的价值观传递给消费者。【含义】A,第一个是英文的authentic,就是真正,V就是value,价值,第三个A,最后一个A是attitude,态度,言外之意就是真实、价值、态度,前面的首字母就叫AVA,这是我的...
AVA战车模式详解战地之王
AVA正经历终极封测,这也意味着离我们大众玩家的距离越来越近了,本人在此介绍下AVA中的一大特色游戏模式:战车模式. 好了废话不多说,首先说明下战车模式对于两队的任务目标:同盟:护送坦克在一定时间内突破目标地点。联军:2个字---“防守”近来老发现有些人说该取消掉RPG说影响平衡。其实RPG是战车...
以”A”为首字母的女生英文名,及男生英文名,请尽量全,谢谢~~
上女性英文名字大全看看 男生:Aaron, 艾伦, 希伯来 巍然的高山;受神启示的。Abbott, 艾布特 希伯来 父性的;伟大的精神。Abel, 亚伯, 拉丁, 生命;呼吸。Abner, 艾布纳 希伯来 睿智;有智慧 。Abraham 亚伯拉罕, 希伯来 崇高的父亲;众人之父。Adair, 亚岱尔 苏格兰,爱尔兰 犹如像树般坚强。
Ava枪的出产地
FN在1995年就开始着手研制一种新的武器系统,考虑到未来特种作战的需要,FN公司将模块化思想贯穿到这个新产品的开发中,使士兵在战场环境中很容易更换部件来适应不同情况的需求,同时,他们也要求这种武器为未来可能出现的新型部件留下接口。2001年3月在阿拉伯联合酋长国阿布扎比举行的IDEX展览会上,FN公司第...
性能分析:三兵种AVA主流枪支点评
AVA侦察兵冲锋枪有5把:MP5KPP-19PP90UZIMP5A3这几把枪呢,其实最适合大家用的还是PP90和MP5系列PP90最大的优势就是良好的稳定性能,稳定性能恰恰与射击时的精度密切相关。侦察兵注重的就是跑位二字,所以一定少不了移动跑位时的KAI枪射击,而PP90恰恰能让你在移动时KAI枪,并且还能保持连发的精度...
AVA中TPG1 算不算好啊!!
AVA的狙击在消弱很厉害。体验服的K98一枪不死很正常。如果你像挑选狙击我给你几个建议 鹰眼版本 首选单发 K98 再之 莫辛纳干 A点武器 而且是运气相伴才能获得性价比不高。FR-F2经典(专业狙击枪瞄准镜,不用切枪)改装推荐远程枪管+专业瞄准镜 声音小 威力大 开境快,重量轻 准确率高 。从性价比...
AVA步兵攻略。
工欲善其事必先利其器,公爵教你玩ak ak47呢在以往的fps游戏中都是以威力大和后座力大而著称的,在ava中也不例外,今天公爵就给大家讲解一下在ava中如何驾驭ak47 对于ak47的使用方法呢,我用五个字来概括:点、拉、扫、甩、泼。这五个字概括了ak47的五种射击方法,我们切叫他ak的五字真言。
AVA枪械改装
那么咱们先说AVA中这2个枪的改造和选择 M4A1 选择步枪那么你要先知道步枪兵是干什么的? 我理解步枪兵就是火力输出者,所以改装方面应该是高射速,高杀伤,高命中为前提. 枪口选择:1. 激光器MK2 准确+2 机动-2 2.激光器准确+1 机动-1 根据你的需要来选我个人认为既然是火力输出准确越高越好.机动性高自然也好...
天城文元音字符
另一个变音符号 candrabindu\/anunāsika ँ,有时作为 anusvāra 的强化形式,用于标记元音鼻音化。在现代印度-雅利安语如印地语中,candrabindu 和 anusvāra 分别表示元音鼻音化和辅音前的鼻音。当元音附标出现在字首时,candrabindu 可简化为单独的点,而 avagraha ऽ 表示元音在连接音变中...
怎样设置AVA的画质应该怎样设置才不卡
然后再以gamebooster的游戏模式进行游戏,也会对性能有一定提升(推荐V1.6中文版本)4.进游戏时,直接登录,不要选择配置检测里的自动设置 进游戏后按TAB查看左下角绿色字FPS值,如过低(低于75就会有明显延迟及不舒服感)请进入游戏设置选择960X600分辨率,其他不改变5.如果你照上述设置及优化后,再以...
阿缸葛山: 楼上的 楼主是要求输入字母求得相关的汉字字符串,而你音品码查询是从汉字求得首字母吧? 我做过一个公交查询系统,其中有个功能就是通过字母显示出相应的站点. 首先,你想通过'W'得到王力宏、王菲等你就必须先把这些名字存到数...
瑞安市19186091490: java怎么实现通过文字获取首字母 - ?
阿缸葛山: 参考代码 public class CharDemo {public static void main(String[] args) {String str = "apple";char c1 = getFirstChar(str);System.out.println("第一种方法:" + str + "的首字母是" + c1);String s1 = getFirstStr(str);System.out.println("...
瑞安市19186091490: java如何实现拼音首字母检索汉字 - ?
阿缸葛山: 使用pinyin4j或者jpinyin的,先将汉字转换为拼音,然后记录拼音的首字母,具体的检索过程可以用循环过滤,也可以用前缀树 比如tire树 参考链接:网页链接 java实现汉字转拼音 网页链接 tire树
瑞安市19186091490: java的拼音字母检索汉字 - ?
阿缸葛山: 参考思路:在数据中应该有三个字段是用来做索引的,字段一:每一个词的拼音,字段二:每一个词的首字母,字段三每个词的汉字,在like的时候同时like这三个字段;可以扩展一个表A,存储汉字的首字母和原数据表B中的id.在进行查询的时候,假如输入cq,那就查A中like cq 的记录,再根据A中存的B.id查询B的记录,便可取到字段实际含义.扩展包的数据同步,有以下方法:1、使用数据库触发器(传闻性能不高);2、获取到批量的记录,定时执行更新,比如spring中配置job任务.
瑞安市19186091490: java怎么获取汉字拼音首字母 - ?
阿缸葛山: 获取首字母需要对汉字表和字母表进行映射,如下示例代码是以gb2312编码为入手点,进行匹配的,也可以使用gbk、utf-8等编码进行匹配
瑞安市19186091490: 在Java编程中如何根据字母查找汉字 - ?
阿缸葛山: 弄个数据库 第一列是汉字 第二列是首字母 考虑到多音字的存在 应该在弄一列ID 用查询语句就行了
瑞安市19186091490: java 获取汉字首字母 - ?
阿缸葛山: 参考即可:http://jingyan.baidu.com/article/84b4f565da5dc960f6da32f5.html
瑞安市19186091490: 如何用JAVA获取中文拼音的首字母 - ?
阿缸葛山: package test; public class FirstLetterUtil { private static int BEGIN = 45217; private static int END = 63486; // 按照声母表示,这个表是在GB2312中的出现的第一个汉字,也就是说“啊”是代表首字母a的第一个汉字. // i, u, v都不做声母, 自定...
瑞安市19186091490: Java怎么写汉字首字母提示,比如在输入框写"zj"则下拉框出现“镇江”,“湛江”等等??
阿缸葛山: 要实现这种,首先你要在后台有个存具体数据的表或者集合,看你用的什么框架,然后用ajax或者dwr技术实现步步查询,就是输入z就查询一次,输入zj再查询一次,=然后定义一个隐藏的区域在要显示的地方用来显示结果就行
瑞安市19186091490: 在Java中,输入一个中文名称,如何得到这个中文名称的每个字的首个英文字母? - ?
阿缸葛山: 可以考虑一下把输入的字符串转换ascii,例如: if(tmp>=45217 && tmp py = "A" } else if(tmp>=45253 && tmp py = "B" }