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
  36.                     String sub=t[i].substring(01);  
  37.                     if(i+1//去掉重复项  
  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 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 
  39.      */  
  40.     public Set 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
  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 paiLie(String[][] str){  
  74.         int max=1;  
  75.         for(int i=0;i
  76.             max*=str[i].length;  
  77.         }  
  78.         Set result=new HashSet();  
  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做的哦。
AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字)2_第1张图片

想做这样的效果吗。
  • TestQuickSearch.rar (653.6 KB)

你可能感兴趣的:(android)