編輯:關於Android編程
Android通訊錄開發之取得姓名首字母實現簡拼搜索
2013年12月27日 開發日志
目前小巫在實習的公司,負責一個項目的開發,雖說是接手過來的,不過經過前面的幾位實習生哥們推敲之後,輪到我的手裡,我只能說我很好運,撿到了一個幾乎需要重構的項目,我接手開發一個月,已經提交了5、6個測試版本,問題一堆,我改代碼改得我想吐。說起這個項目一個重要模塊就是通訊錄這一塊,前面的幾個大哥能把通訊錄做得那麼爛也是他們的本事,我幾乎是在重做這一個模塊,增加了很多新特性,全選、刪除,模糊匹配等,連讀數據庫我也是從新找了個新的方法進行了優化。經過這段時間的推敲,項目總算是有了好轉,我剛開始也是磕磕碰碰得改,也是自己項目經驗不足,很多細節問題沒有注意到,說到底還是對用戶體驗這一塊體會不深,這也只能慢慢修煉了。
之前發了一篇關於模糊匹配搜索的,好像自己的那一塊沒有實現首字母簡拼的匹配,本篇博客也是介紹這一塊。
從http://blog.csdn.net/leayefang/article/details/9082255得到一個好用的工具類,專門用來獲取中文首字母的。
效果圖:
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">package com.suntek.mobilemeeting.utils;
/**
* 2013-12-27
*
* @author wwj
*
*/
public class FirstLetterUtil {
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 static String getFirstLetter(String sourceStr) {
String result = "";
String str = sourceStr.toLowerCase();
int StrLength = str.length();
int i;
try {
for (i = 0; i < StrLength; i++) {
result += Char2Initial(str.charAt(i));
}
} catch (Exception e) {
result = "";
}
return result;
}
/**
* 輸入字符,得到他的聲母,英文字母返回對應的大寫字母,其他非簡體漢字返回 '0'
*/
private static char Char2Initial(char ch) {
// 對英文字母的處理:小寫字母轉換為大寫,大寫的直接返回
if (ch >= 'a' && ch <= 'z') {
return ch;
}
if (ch >= 'A' && ch <= 'Z') {
return ch;
}
// 對非英文字母的處理:轉化為首字母,然後判斷是否在碼表范圍內,
// 若不是,則直接返回。
// 若是,則在碼表內的進行判斷。
int gb = gbValue(ch);// 漢字轉換首字母
if ((gb < BEGIN) || (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;
}
}
}
// 搜索的方法,增加簡拼搜索
/** * 按號碼-拼音搜索聯系人 * * @param str */ public static ArrayListsearch(String str, ArrayList allContacts, ArrayList contactList) { contactList.clear(); // 如果搜索條件以0 1 +開頭則按號碼搜索 if (str.startsWith("0") || str.startsWith("1") || str.startsWith("+")) { for (Contact contact : allContacts) { if (contact.getNumber() != null && contact.getName() != null) { if (contact.getNumber().contains(str) || contact.getName().contains(str)) { contact.setGroup(str); contactList.add(contact); } } } return contactList; } boolean isChinese = false; Pattern pattern = Pattern.compile("[\\u4E00-\\u9FA5]"); Matcher matcher = pattern.matcher(str); if (matcher.find()) { // 如果是中文 isChinese = true; } for (Contact contact : allContacts) { if (contains(contact, str, isChinese)) { contactList.add(contact); } else if (contact.getNumber().contains(str)) { contact.setGroup(str); contactList.add(contact); } } return contactList; } /** * 根據拼音搜索 * * @param str * 正則表達式 * @param pyName * 拼音 * @param isIncludsive * 搜索條件是否大於6個字符 * @return */ public static boolean contains(Contact contact, String search, boolean isChinese) { if (TextUtils.isEmpty(contact.getName())) { return false; } boolean flag = false; if (isChinese) { // 根據全拼中文查詢 Pattern pattern = Pattern.compile(search.replace("-", ""), Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(contact.getName()); if (flag) { contact.setGroup(matcher.group()); } return matcher.find(); } // 簡拼匹配,如果輸入在字符串長度大於6就不按首字母匹配了 if (search.length() < 6) { String firstLetters = FirstLetterUtil.getFirstLetter(contact .getName()); Pattern firstLetterMatcher = Pattern.compile(search.toLowerCase(), Pattern.CASE_INSENSITIVE); return firstLetterMatcher.matcher(firstLetters).find(); } // 全拼匹配 ChineseSpelling finder = ChineseSpelling.getInstance(); finder.setResource(contact.getName()); Pattern pattern2 = Pattern.compile(search.toUpperCase(), Pattern.CASE_INSENSITIVE); Matcher matcher2 = pattern2.matcher(finder.getSpelling()); flag = matcher2.find(); return flag; }
先給大家看下效果圖:MenuPopwindow:package com.cloudeye.android.cloudeye.view;import android.app
在iis7中默認的MIME類型並不包含所有的後綴名文件,像現在比較熱門的apk,ipa文件都是需要手動添加的。那如何在IIS添加MIME類型?步驟如下:1、打開iis7,
一.概述因為之前項目有動態熱修復的功能,在修復的過程中會從服務器上下載一個新的dex文件來替換老的dex文件,所以就牽扯到文件身份效驗的問題.通常接口會下發一個MD5值,
今天有空學習了下CardView的使用,既然是使用,不凡使用一個實例操作一下CardView是Android5.0的新控件,所以我們需要在dependencies中添加支