簡體   English   中英

在Java / Android中過濾arraylist

[英]Filter arraylist in java/android

您好我需要篩選ArrayList

我有一個包含以下各項的ArrayList

“你好世界”“你好男人”“你好女人”“再見世界”“再見男人”“再見女人”

然后在TextBox上添加了一個textchanged偵聽器(Android)。我想要的是,如果我用空格隔開寫“ he wo”,則顯示“ Hello world”和“ Hello woman”。

我已經為此奮斗了大約一個小時,只有我得到的是,如果我寫“ he wo”,我會得到以下項目: “ Hello world”,“ Hello man”,“ Hello woman”,“ Goodbye world” 這是代碼

 et.addTextChangedListener(new TextWatcher()
    {
        public void afterTextChanged(Editable s)
        {
          // Abstract Method of TextWatcher Interface.
        }
        public void beforeTextChanged(CharSequence s,
        int start, int count, int after)
        {
        // Abstract Method of TextWatcher Interface.
        }
        public void onTextChanged(CharSequence s, int start, int before, int count)
        {
            //listabusClientes = new ArrayList<busCliente>();
            paraulesBuscar = s.toString().split(" "); //Array of string
            sortarray = new ArrayList<busCliente>(); //ArrayList of class busCliente
            sortarray.clear();

            for(int x = 0; x < paraulesBuscar.length; x++){
                sortarray.clear();
                for (int i = 0; i < listabusClientes.size(); i++)
                {
                    if ((listabusClientes.get(i).getNom().toUpperCase().indexOf(paraulesBuscar[x].toUpperCase()) != -1) || (listabusClientes.get(i).getCodiClient().toUpperCase().indexOf(paraulesBuscar[x].toUpperCase()) != -1))
                    {
                        sortarray.add(listabusClientes.get(i)); 
                    }
                }
            }
            lv.setAdapter(new ListViewAdapter(buscar_client.this,
                     R.layout.simple_list_item_1, sortarray));
        }
  });

編輯算法

paraulesBuscar = s.toString().split(" ");
                                    sortarray = new ArrayList<busCliente>();
                                    sortarray.clear();

                                    for(int x = 0; x < paraulesBuscar.length; x++){
                                        sortarray.clear();
                                        for (int i = 0; i < listabusClientes.size(); i++)
                                        {   
                                            String[] clientSplit = listabusClientes.get(i).getNom().split(" ");

                                            for(int cs = 0; cs < clientSplit.length; cs++){
                                                System.out.println(clientSplit[cs]);
                                                if (clientSplit[cs].toUpperCase().contains(paraulesBuscar[x].toUpperCase()))
                                                {
                                                    sortarray.add(listabusClientes.get(i)); 

                                                }
                                            }

                                        }
                                    }

這是我的做法:

  1. 使用String.split()將“ he wo”分解為單詞,以獲得前綴數組["he", "wo"]
  2. 迭代項目。 對於每個項目,將其拆分為單詞,以獲得單詞數組["Hello", "World"]
  3. 檢查單詞數組的長度至少與前綴數組的長度相同。 如果不是,則該項目被拒絕
  4. 遍歷前綴的索引。 對於每個索引,獲取前綴和單詞。 將單詞轉換為小寫。 檢查它是否以前綴開頭。 所有這些方法在String類中都可用。 如果它不是以前綴開頭,則該項目被拒絕。

這應該使您入門。 確保將此算法實現為單獨的方法,其本身又分解為只做一件事的子方法。

編輯:

這是算法的最后一部分(步驟3和4):

/**
 * Tells if every prefix has a corresponding word and if every word, lower-cased, 
 * starts with the corresponding prefix.
 */
private boolean allPrefixesMatch(String[] prefixes, String[] words) {
    if (words.length < prefixes.length) {
        return false;
    }
    for (int i = 0; i < prefixes.length; i++) {
        String prefix = prefixes[i];
        String word = words[i];
        if (!word.toLowerCase().startsWith(prefix)) {
            return false;
        }
    }
    return true;
}

我建議您使用其他方法來解決此問題。 創建一個擴展ArrayAdapter並實現可過濾接口的自定義適配器。

在您的適配器中,創建一個擴展Filter的私有類。 您必須重寫兩個方法:

protected FilterResults performFiltering(CharSequence constraint) {.. }

protected void publishResults(CharSequence constraint,
            FilterResults results) {..}

在第一個設置過濾規則的情況下,可以驗證項目中是否包含字符串。 在第二種方法中,您將發布過濾后的結果,並調用notifyDataSetChanged();。

您正確添加了一個changeTextListener,但是在onTextChanged中調用了過濾器以執行過濾操作:

aAdpt.getFilter().filter(s.toString());

其中aAdpt是您的自定義適配器。 我希望我很清楚。 如果您有任何疑問,可以在這里參考我的帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM