`

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

阅读更多
2011年最后一篇。。。。

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

写了一个转换函数,将类似4E48 (me5,ma5,yao1)的文本转换成4E48 (m,y),代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		final String fromName = "e:\\unicode_to_hanyu_pinyin.txt";
	    final String toName = "e:\\unicode_to_simple_pinyin.txt";
		TestMain t=new TestMain();
		t.convert(fromName,toName);
	}

	public void convert(String fromFile,String toFile) {
		 
        try {
        	BufferedWriter writer = new BufferedWriter(new FileWriter(new File(toFile)));
        	BufferedReader reader = new BufferedReader(new FileReader(new File(fromFile)));
            String tempString = null;
            int line = 1;
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
                String pre=getPre(tempString);//获得“(”前面部分
                
                String[] t=getMiddle(tempString);//
                String s="";
                for(int i=0;i<t.length;i++){
                	String sub=t[i].substring(0, 1);
                	if(i+1<t.length){//去掉重复项
                		String sub2=t[i+1].substring(0, 1);
                		if(sub.equals(sub2)){
                			continue;
                		}
                	}
                	s+=","+sub;
                }
                s=pre+s.substring(1)+")";
                writer.write(s);
                writer.newLine();
                line++;
            }
            reader.close();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        } 
        
    }
	
	private String getPre(String pinyinRecord){
		int indexOfLeftBracket = pinyinRecord.indexOf("(")+1;
		 String stripedString = pinyinRecord.substring(0,indexOfLeftBracket);
		 return stripedString;
	}
	
	private String[] getMiddle(String pinyinRecord){
            int left= pinyinRecord.indexOf("(");
            int right= pinyinRecord.lastIndexOf(")");
            String middle = pinyinRecord.substring(left+ "(".length(), right);
            return middle.split(",");
    }
}


修改PinYin4j.java:
package com.ql.util;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class PinYin4j {
	
	
	public PinYin4j(){
	}
	/**
	 * 字符串集合转换字符串(逗号分隔),测试用
	 * 
	 * @param stringSet
	 * @return
	 */
	public String makeStringByStringSet(Set<String> stringSet) {
		StringBuilder str = new StringBuilder();
		int i = 0;
		for (String s : stringSet) {
			if (i == stringSet.size() - 1) {
				str.append(s);
			} else {
				str.append(s + ",");
			}
			i++;
		}
		return str.toString().toLowerCase();
	}

	
	/**
	 * 获取拼音集合
	 * 
	 * @author wyh
	 * @param src
	 * @return Set<String>
	 */
	public Set<String> getPinyin(String src) {
			char[] srcChar;
			srcChar = src.toCharArray();

			//1:多少个汉字
			//2:每个汉字多少种读音
			String[][] temp = new String[src.length()][];
			for (int i = 0; i < srcChar.length; i++) {
				char c = srcChar[i];
				// 是中文或者a-z或者A-Z转换拼音(我的需求,是保留中文或者a-z或者A-Z)
				if (String.valueOf(c).matches("[\\u4E00-\\u9FA5]+")) {//中文
						String[] t = PinyinHelper.getUnformattedHanyuPinyinStringArray(c);
						temp[i] = new String[t.length];
						for(int j=0;j<t.length;j++){
//							temp[i][j]=t[j].substring(0,1);//获取首字母
							temp[i][j]=t[j];//获取首字母,不需要再截取了
						}
				} else if (((int) c >= 65 && (int) c <= 90)
						|| ((int) c >= 97 && (int) c <= 122)
						||c>=48&&c<=57||c==42) {//a-zA-Z0-9*
					temp[i] = new String[] { String.valueOf(srcChar[i]) };
				} else {
					temp[i] = new String[] {"null!"};
				}
				
			}
			return paiLie(temp);//直接返回Set
	}
	
	/*
	 * 求2维数组所有排列组合情况
	 * 比如:{{1,2},{3},{4},{5,6}}共有2中排列,为:1345,1346,2345,2346
	 */
	private Set<String> paiLie(String[][] str){
		int max=1;
		for(int i=0;i<str.length;i++){
			max*=str[i].length;
		}
		Set<String> result=new HashSet<String>();
		for(int i = 0; i < max; i++){
            String s = "";
            int temp = 1;      //注意这个temp的用法。
            for(int j = 0; j < str.length; j++){
                temp *= str[j].length;
                s += str[j][i / (max / temp) % str[j].length];
            }
            result.add(s);
	    }
		
		return result;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//nongyeyinheng,nongyeyinhang,nongyeyinxing
		PinYin4j t=new PinYin4j();
		String str = "农业银行1234567890abcdefghijklmnopqrstuvwxyz*";
		System.out.println(t.makeStringByStringSet(t.getPinyin(str)));
	}

}

其他地方可以保持不变。

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


想做这样的效果吗。
  • 大小: 92.8 KB
分享到:
评论

相关推荐

    AutoCompleteTextView输入汉字拼音首字母实现过滤提示

    android API中的 AutoCompleteTextView组件只能匹配过滤纯英文或者纯汉字的 经过改进后可以输入 汉字拼音匹配汉字 类似于百度搜索 例如输入x 会匹配“迅雷”“迅速” 如果输入s 也可以匹配 “迅速”

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

    可以参考下面博客:我的Android进阶之旅------&gt;Android之AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字) (博客地址:http://blog.csdn.net/ouyang_peng/article/details/8826806)

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

    AutoCompleteTextView具有输入提示的功能,但是它的这种提示不适合对股票列表的过滤,如果你玩过股票软件,就会知道只要输入股票名称的首字母或股票代码就会出现符合匹配的股票,这种过滤怎么实现呢? 还有个问题,...

    AutoCompleteTextView汉字和拼音关联

    通过以上步骤,我们就可以实现一个支持汉字和拼音查询的`AutoCompleteTextView`。`CityAdapter.java`中的具体实现细节,包括如何处理拼音、如何过滤和显示建议,都需要查看源代码才能详细分析。在实际开发中,可能还...

    AutoCompleteTextView中输入字母或者汉字通过Filterable实现自动筛选提醒Demo

    总结起来,通过实现 `Filterable` 接口,我们可以自定义 `AutoCompleteTextView` 的数据过滤逻辑,从而实现根据用户输入的字母或汉字动态显示匹配的提示项。在实际开发中,可以根据具体需求调整过滤算法和 UI 设计,...

    AutoCompleteTextView中文和拼音关联自动提示

    在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表,从而提升用户体验。...在实际开发中,还可以根据需求进行更多的定制,如添加搜索历史记录、支持多音字等。

    AutoCompleteTextView自动提示问题

    AutoCompleteTextView是Android SDK提供的一种UI组件,用于在用户输入时提供下拉列表的自动提示功能,极大地提升了用户的输入体验。这个控件通常用于搜索框、地址输入等场景,可以根据用户输入的部分字符快速匹配出...

    AutoCompleteTextView自动完成文字输入

    AutoCompleteTextView是Android SDK提供的一种用于输入文本时自动补全的视图组件,它扩展了EditText,能够根据用户输入的部分文字动态显示出匹配的建议列表。这个功能在许多应用中非常常见,例如搜索引擎、地址...

    AutoCompleteTextView自动提示输入文字信息

    本篇文章将深入探讨如何结合ListView来实现AutoCompleteTextView的自动提示功能。 1. **AutoCompleteTextView基本用法** AutoCompleteTextView继承自EditText,主要通过`setAdapter()`方法连接数据源,这个数据源...

    使用AutoCompleteTextView实现自动匹配输入的内容

    AutoCompleteTextView是Android SDK提供的一种视图组件,用于在用户输入文本时提供下拉列表的自动补全功能。它能够极大地提升用户体验,特别是在用户需要从大量预定义选项中选择时。在开发移动应用,尤其是涉及搜索...

    AutoCompleteTextView 自动提示联系人信息

    在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表,极大地提高了用户体验。本篇将详细讲解`AutoCompleteTextView`如何用于自动提示联系人信息,并结合从...

    Android仿百度谷歌自动提示——AutoCompleteTextView

    在Android开发中,提供用户友好的输入体验是至关重要的,其中一种常见的做法是实现自动提示功能,这在很多应用的搜索框中都能看到。本文将详细介绍如何在Android中仿照百度和谷歌的自动提示功能,利用`...

    Android AutoCompleteTextView自动提示输入

    Android AutoCompleteTextView自动提示输入。我博客网址: http://blog.csdn.net/qq_16064871。我写了很多博客都是有源码的,请多多关注。

    AutoCompleteTextViewDemo

    4. **过滤与匹配**:AutoCompleteTextView内部实现了过滤逻辑,当用户输入文本时,会触发适配器的`getFilter()`方法,该方法返回一个Filter对象,用于过滤数据并提供匹配的建议。 5. **显示建议列表**:一旦过滤...

    android 首字母搜索

    2. 用户输入监听:监听用户的输入事件,获取输入的首字母。 3. 搜索逻辑:根据输入的首字母查找对应的分组,提取匹配的条目。 4. 更新UI:将匹配的条目显示在列表中。 二、Android搜索功能实现 1. 数据结构设计:...

    AutoCompleteTextView+SQLite实现自动检索

    在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表,极大地提高了用户体验。结合SQLite数据库,我们可以实现高效、动态的数据检索,为用户提供实时的搜索...

    使用AutoCompleteTextView登录界面的业务过滤

    - 首先,在布局XML文件中添加`AutoCompleteTextView`组件,并设置相应的属性,如输入限制、提示文字等。 - 在Java代码中,为`AutoCompleteTextView`设置数据源,通常是一个适配器(如ArrayAdapter或CursorAdapter...

    自定义AutoCompleteTextView下拉列表控件

    在Android开发中,`AutoCompleteTextView` 是一个非常常见的组件,它用于实现自动补全功能,通常用于输入框中提供用户可能输入的建议。在给定的标题“自定义AutoCompleteTextView下拉列表控件”中,我们可以理解为...

    AutoCompleteTextView 显示更多

    标题与描述均提到了“AutoCompleteTextView 显示更多”,这主要关注于如何优化AutoCompleteTextView在Android应用中的表现,特别是如何调整下拉建议列表的高度,以便在屏幕上显示更多的选项。以下将深入探讨这一主题...

Global site tag (gtag.js) - Google Analytics