第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何允許在 Android 中使用字符重音進(jìn)行搜索?

如何允許在 Android 中使用字符重音進(jìn)行搜索?

翻翻過去那場(chǎng)雪 2023-12-30 15:56:26
我在我的應(yīng)用程序中實(shí)現(xiàn)了一個(gè)搜索機(jī)制,這樣當(dāng)我搜索姓名或電子郵件時(shí),它會(huì)顯示具有匹配字符的字符串。但是,我的列表中有一些帶重音的字符串,當(dāng)我使用與該特定重音相關(guān)的常規(guī)字符進(jìn)行搜索時(shí),假設(shè)我有字符串“àngela”并且我搜索“angela”,它不會(huì)顯示該字符串,除非我使用確切的字符串“進(jìn)行搜索”安吉拉”。我試圖讓它工作,無論重音與否,假設(shè)我輸入“à”,它應(yīng)該顯示包含“à”和“a”的所有字符串,反之亦然。知道該怎么做嗎?我在網(wǎng)上查找了一堆文章,例如:How toignoreaccent in SQLite query (Android) ",也嘗試了規(guī)范化器,但它部分有效,如果我搜索“a”,它確實(shí)也會(huì)顯示帶有常規(guī)字母的重音字母,但是如果我用帶重音的字母搜索,它不會(huì)顯示任何內(nèi)容。這是我的過濾器代碼:@Override    public Filter getFilter() {        return new Filter() {            @Override            protected FilterResults performFiltering(CharSequence charSequence) {                String charString = charSequence.toString();                if (charString.isEmpty()) {                    mSearchGuestListResponseListFiltered = mSearchGuestListResponseList;                } else {                    List<RegisterGuestList.Guest> filteredList = new ArrayList<>();                    for (RegisterGuestList.Guest row : mSearchGuestListResponseList) {                        // name match condition. this might differ depending on your requirement                        // here we are looking for name or phone number match                        String firstName = row.getGuestFirstName().toLowerCase();                        String lastName = row.getGuestLastName().toLowerCase();                        String name = firstName + " " +lastName;                        String email = row.getGuestEmail().toLowerCase();                        if ( name.trim().contains(charString.toLowerCase().trim()) ||                                email.trim().contains(charString.toLowerCase().trim())){                            filteredList.add(row);                            searchText = charString.toLowerCase();                        }                    }        };    }如果有人感興趣,這里是整個(gè)適配器類:https://pastebin.com/VxsWWMiS 這是相應(yīng)的活動(dòng)視圖:如有必要,很樂意分享任何細(xì)節(jié)。另外,我在搜索時(shí)隨機(jī)得到了indexoutofboundexception onBind()方法(使用recyclerview作為列表):java.lang.IndexOutOfBoundsException: Index: 7, Size: 0        at java.util.ArrayList.get(ArrayList.java:437)知道該怎么做嗎?
查看完整描述

1 回答

?
慕少森

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊

一般來說,我建議使用Collator強(qiáng)度設(shè)置為 的Collator.PRIMARY來比較包含重音符號(hào)和不同大小寫的字符串(例如,Nvsn和évs e)。不幸的是,Collator沒有contains()功能。


所以我們將自己制作。


private static boolean contains(String source, String target) {

    if (target.length() > source.length()) {

        return false;

    }


    Collator collator = Collator.getInstance();

    collator.setStrength(Collator.PRIMARY);


    int end = source.length() - target.length() + 1;


    for (int i = 0; i < end; i++) {

        String sourceSubstring = source.substring(i, i + target.length());


        if (collator.compare(sourceSubstring, target) == 0) {

            return true;

        }

    }


    return false;

}

這會(huì)迭代源字符串,并檢查與搜索目標(biāo)長度相同的每個(gè)子字符串是否等于搜索目標(biāo)(就 Collator 而言)。


例如,假設(shè)我們的源字符串是,"This is a Tèst"并且我們正在搜索單詞"test"。此方法將迭代每個(gè)四個(gè)字母的子字符串:


This

his 

is i

s is

 is 

is a

s a 

 a T

a Tè

 Tès

Tèst

一旦找到匹配項(xiàng)就會(huì)返回 true。由于強(qiáng)度設(shè)置為Collator.PRIMARY,整理器認(rèn)為"Tèst"和"test"相等,因此我們的方法返回true。


此方法很可能需要進(jìn)行更多優(yōu)化,但這應(yīng)該是一個(gè)合理的起點(diǎn)。


編輯RuleBasedCollator:一種可能的優(yōu)化是利用排序規(guī)則鍵以及and的已知實(shí)現(xiàn)細(xì)節(jié)RuleBasedCollationKey(假設(shè)您的項(xiàng)目中有 Google 的 Guava):


private static boolean containsBytes(String source, String target) {

    Collator collator = Collator.getInstance();

    collator.setStrength(Collator.PRIMARY);


    byte[] sourceBytes = dropLastFour(collator.getCollationKey(source).toByteArray());

    byte[] targetBytes = dropLastFour(collator.getCollationKey(target).toByteArray());


    return Bytes.indexOf(sourceBytes, targetBytes) >= 0;

}


private static byte[] dropLastFour(byte[] in) {

    return Arrays.copyOf(in, in.length - 4);

}

這是相當(dāng)脆弱的(可能不適用于所有語言環(huán)境),但在我的測(cè)試中,它的速度快了 2 倍到 10 倍。


編輯:要支持突出顯示,您應(yīng)該轉(zhuǎn)換contains()為indexOf(),然后使用該信息:


private static int indexOf(String source, String target) {

    if (target.length() > source.length()) {

        return -1;

    }


    Collator collator = Collator.getInstance();

    collator.setStrength(Collator.PRIMARY);


    int end = source.length() - target.length() + 1;


    for (int i = 0; i < end; i++) {

        String sourceSubstring = source.substring(i, i + target.length());


        if (collator.compare(sourceSubstring, target) == 0) {

            return i;

        }

    }


    return -1;

}

然后你可以像這樣應(yīng)用它:


String guestWholeName = guest.getGuestFirstName() + " " + guest.getGuestLastName();

int wholeNameIndex = indexOf(guestWholeName, searchText);


if (wholeNameIndex > -1) {

    Timber.d("guest name first : guest.getGuestFirstName() %s", guest.getGuestFirstName());

    Timber.d("guest name last : guest.getGuestLastName() %s", guest.getGuestLastName());


    int endPos = wholeNameIndex + searchText.length();


    Spannable spannable = new SpannableString(guestWholeName);

    Typeface firstNameFont = Typeface.createFromAsset(context.getAssets(), "fonts/Graphik-Semibold.otf");

    spannable.setSpan(new CustomTypefaceSpan("", firstNameFont), wholeNameIndex, endPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    Objects.requireNonNull(guestName).setText(spannable);

} else {

    Objects.requireNonNull(guestName).setText(guestWholeName);

}


查看完整回答
反對(duì) 回復(fù) 2023-12-30
  • 1 回答
  • 0 關(guān)注
  • 144 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)