AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字)2

上一篇中的代码最好需要优化,特别对字库文件需要优化。股票成千上万个,如何做到快速匹配是很值得研究的。

写了一个转换函数,将类似4E48 (me5,ma5,yao1)的文本转换成4E48 (m,y),代码如下:
Java代码   收藏代码
  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.File;  
  4. import java.io.FileReader;  
  5. import java.io.FileWriter;  
  6. import java.io.IOException;  
  7.   
  8. public class TestMain {  
  9.   
  10.     /** 
  11.      * @param args 
  12.      */  
  13.     public static void main(String[] args) {  
  14.         // TODO Auto-generated method stub  
  15.   
  16.         final String fromName = "e:\\unicode_to_hanyu_pinyin.txt";  
  17.         final String toName = "e:\\unicode_to_simple_pinyin.txt";  
  18.         TestMain t=new TestMain();  
  19.         t.convert(fromName,toName);  
  20.     }  
  21.   
  22.     public void convert(String fromFile,String toFile) {  
  23.            
  24.         try {  
  25.             BufferedWriter writer = new BufferedWriter(new FileWriter(new File(toFile)));  
  26.             BufferedReader reader = new BufferedReader(new FileReader(new File(fromFile)));  
  27.             String tempString = null;  
  28.             int line = 1;  
  29.             while ((tempString = reader.readLine()) != null) {  
  30.                 // 显示行号  
  31.                 String pre=getPre(tempString);//获得“(”前面部分  
  32.                   
  33.                 String[] t=getMiddle(tempString);//  
  34.                 String s="";  
  35.                 for(int i=0;i<t.length;i++){  
  36.                     String sub=t[i].substring(01);  
  37.                     if(i+1<t.length){//去掉重复项  
  38.                         String sub2=t[i+1].substring(01);  
  39.                         if(sub.equals(sub2)){  
  40.                             continue;  
  41.                         }  
  42.                     }  
  43.                     s+=","+sub;  
  44.                 }  
  45.                 s=pre+s.substring(1)+")";  
  46.                 writer.write(s);  
  47.                 writer.newLine();  
  48.                 line++;  
  49.             }  
  50.             reader.close();  
  51.             writer.close();  
  52.         } catch (IOException e) {  
  53.             e.printStackTrace();  
  54.         }   
  55.           
  56.     }  
  57.       
  58.     private String getPre(String pinyinRecord){  
  59.         int indexOfLeftBracket = pinyinRecord.indexOf("(")+1;  
  60.          String stripedString = pinyinRecord.substring(0,indexOfLeftBracket);  
  61.          return stripedString;  
  62.     }  
  63.       
  64.     private String[] getMiddle(String pinyinRecord){  
  65.             int left= pinyinRecord.indexOf("(");  
  66.             int right= pinyinRecord.lastIndexOf(")");  
  67.             String middle = pinyinRecord.substring(left+ "(".length(), right);  
  68.             return middle.split(",");  
  69.     }  
  70. }  


修改PinYin4j.java:
Java代码   收藏代码
  1. package com.ql.util;  
  2.   
  3. import java.util.Arrays;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. public class PinYin4j {  
  8.       
  9.       
  10.     public PinYin4j(){  
  11.     }  
  12.     /** 
  13.      * 字符串集合转换字符串(逗号分隔),测试用 
  14.      *  
  15.      * @param stringSet 
  16.      * @return 
  17.      */  
  18.     public String makeStringByStringSet(Set<String> stringSet) {  
  19.         StringBuilder str = new StringBuilder();  
  20.         int i = 0;  
  21.         for (String s : stringSet) {  
  22.             if (i == stringSet.size() - 1) {  
  23.                 str.append(s);  
  24.             } else {  
  25.                 str.append(s + ",");  
  26.             }  
  27.             i++;  
  28.         }  
  29.         return str.toString().toLowerCase();  
  30.     }  
  31.   
  32.       
  33.     /** 
  34.      * 获取拼音集合 
  35.      *  
  36.      * @author wyh 
  37.      * @param src 
  38.      * @return Set<String> 
  39.      */  
  40.     public Set<String> getPinyin(String src) {  
  41.             char[] srcChar;  
  42.             srcChar = src.toCharArray();  
  43.   
  44.             //1:多少个汉字  
  45.             //2:每个汉字多少种读音  
  46.             String[][] temp = new String[src.length()][];  
  47.             for (int i = 0; i < srcChar.length; i++) {  
  48.                 char c = srcChar[i];  
  49.                 // 是中文或者a-z或者A-Z转换拼音(我的需求,是保留中文或者a-z或者A-Z)  
  50.                 if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")) {//中文  
  51.                         String[] t = PinyinHelper.getUnformattedHanyuPinyinStringArray(c);  
  52.                         temp[i] = new String[t.length];  
  53.                         for(int j=0;j<t.length;j++){  
  54. //                          temp[i][j]=t[j].substring(0,1);//获取首字母  
  55.                             temp[i][j]=t[j];//获取首字母,不需要再截取了  
  56.                         }  
  57.                 } else if (((int) c >= 65 && (int) c <= 90)  
  58.                         || ((int) c >= 97 && (int) c <= 122)  
  59.                         ||c>=48&&c<=57||c==42) {//a-zA-Z0-9*  
  60.                     temp[i] = new String[] { String.valueOf(srcChar[i]) };  
  61.                 } else {  
  62.                     temp[i] = new String[] {"null!"};  
  63.                 }  
  64.                   
  65.             }  
  66.             return paiLie(temp);//直接返回Set  
  67.     }  
  68.       
  69.     /* 
  70.      * 求2维数组所有排列组合情况 
  71.      * 比如:{{1,2},{3},{4},{5,6}}共有2中排列,为:1345,1346,2345,2346 
  72.      */  
  73.     private Set<String> paiLie(String[][] str){  
  74.         int max=1;  
  75.         for(int i=0;i<str.length;i++){  
  76.             max*=str[i].length;  
  77.         }  
  78.         Set<String> result=new HashSet<String>();  
  79.         for(int i = 0; i < max; i++){  
  80.             String s = "";  
  81.             int temp = 1;      //注意这个temp的用法。  
  82.             for(int j = 0; j < str.length; j++){  
  83.                 temp *= str[j].length;  
  84.                 s += str[j][i / (max / temp) % str[j].length];  
  85.             }  
  86.             result.add(s);  
  87.         }  
  88.           
  89.         return result;  
  90.     }  
  91.       
  92.     /** 
  93.      * @param args 
  94.      */  
  95.     public static void main(String[] args) {  
  96.         //nongyeyinheng,nongyeyinhang,nongyeyinxing  
  97.         PinYin4j t=new PinYin4j();  
  98.         String str = "农业银行1234567890abcdefghijklmnopqrstuvwxyz*";  
  99.         System.out.println(t.makeStringByStringSet(t.getPinyin(str)));  
  100.     }  
  101.   
  102. }  

其他地方可以保持不变。

最后,采用AutoCompleteTextView做出来的提示很丑,漂亮一点的看下图,这可不是AutoCompleteTextView做的哦。


想做这样的效果吗。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目中有一个城市导航,导航上有一个城市搜索,即用户输入城市名、或拼音即可有匹配的提示,方便用户选择。于是乎下载了一个jquery.autocomplete-1.1.3,但引用到项目后,发现几个问题,并相应做了修改: 1.中文输入后,服务端不能正常获取ajax提交的数据(此处,当然可以用相应转码,本人试了n种方便仍改),细看代码发现, 是用 $.get(this.serviceUrl, me.options.params, function(txt) { me.processResponse(txt); }, 'text'); 提交的, 于是改成了我熟悉的提交方式。 $.ajax({url:this.serviceUrl,data:"query="+me.options.params.query,timeout: 5000,success: function(o){me.processResponse(o);}}); 问题立即解决。 猜想,是默认utf-8编码与我服务端过滤器中转码以及代码的转码发生了冲突。 2.当输入框值发生变化时,onchange事件不灵敏。 于是,添加了一个函数,输入值一但onchange就调用 。 onKeyProcessDefult: function(i) { var me, fn, s, d; me = this; s = me.suggestions[i]; d = me.data[i]; if(this.currentValue!=s || undefined==d){d="";s="";} this.selectedIndex=0; //输入时,一但有匹配的项,就默认选择第一项,这样,再按回车键,即可直接submit提交 jht添加 2011-07-20 $(".auto_selected_val").val(d); } 3. 当输入正确值,而不去选择相应提示项时,按回车键,不能完成自动提交。另外就是,当输入正确值,而不去选择相应提示项进,点击后面的提交按钮,也不能完成提交。(赶集网的城市切换也有这个小瑕疵哦)。 于是修改为,一但输入后只有可匹配的项时,就默认选中第一项(代码如上)。 这样,再提交就不是问题了。 4.输入值,当没有相应匹配项时,没有任何提示,不友好,影响用户体验。 5.服务服端注意返回json格式参数格试哦{ query:'c',suggestions:['北京','保定','包头','本溪'],data:['hr','cu','cy','cz'] } 项目应用实例:http://www.juyuan.com/members/city 参考实案例:http://www.ganji.com/index.htm

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值