[英]contains() method not working as expected
我正在為 android 構建一個語音助手,這里這個方法會一個一個地檢索聯系人姓名並將其與 SpeechToText 輸入進行比較。
我成功獲取了聯系人姓名,但是當我將其與輸入文本進行比較時,什么也沒有發生。
這是代碼
private void callFromContact(String text_received, int index){
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())
{
String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
if(text_received.toLowerCase().contains(name)){
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactNames.add(name);
contactNumbers.add(phoneNumber);
}
}
這里例如我發送“call karan”作為輸入,同時調試名稱“Karan”作為名稱變量的值,但是在if語句中比較它時,沒有任何反應,我的意思是下一條語句沒有執行,什么可能是問題所在,我們將不勝感激。
您還需要將name
變量轉換為小寫,因為String.contains()
方法區分大小寫,所以call karan
不包含Karan
。
如果您只想比較 2 個字符串,無論它們是小寫還是大寫,都應該使用equalsIgnoreCase 。 在你的情況下:
if (text_received.equalsIgnoreCase(name))
{
//...
}
編輯:根據Bohuslav Burghard的評論,如果您需要搜索字符串的特定部分並使其忽略大小寫,您可以使用帶有匹配功能的正則表達式:
if (text_received.matches("(?i:.*" + name + ".*)"))
{
//...
}
我使用了這種方法,效果很好。 match() 沒有滿足我的需要,既不是 equal() 也不是 equalToIgnore ...
public static boolean containsIgnoreCase(String src, String what) {
final int length = what.length();
if (length == 0)
return true; // Empty string is contained
final char firstLo = Character.toLowerCase(what.charAt(0));
final char firstUp = Character.toUpperCase(what.charAt(0));
for (int i = src.length() - length; i >= 0; i--) {
// Quick check before calling the more expensive regionMatches() method:
final char ch = src.charAt(i);
if (ch != firstLo && ch != firstUp)
continue;
if (src.regionMatches(true, i, what, 0, length))
return true;
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.