【问题标题】:Filter arraylist in java/android在 java/android 中过滤数组列表
【发布时间】:2013-05-01 04:06:03
【问题描述】:

您好,我需要过滤一个 ArrayList

我有一个 ArrayList 包含以下项目:

“你好世界” “你好人” 《你好女人》 “世界再见” “再见了人” “再见女人”

然后在 TextBox 上我添加了一个 textchanged 侦听器(Android)。我想要的是如果我用空格分隔写“he wo”,它会显示“Hello world”和“Hello woman”。

我已经为此奋斗了大约一个小时,只有我得到的是,如果我写“he wo”,我会得到以下项目:“Hello world”,“Hello man”,“Hello woman”, “再见世界”。 这是代码

 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)); 

                                                }
                                            }

                                        }
                                    }

【问题讨论】:

    标签: java android filter arraylist filtering


    【解决方案1】:

    我会这样做:

    1. 将“he wo”拆分成单词,使用String.split(),得到前缀数组["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;
    }
    

    【讨论】:

    • 它做同样的事情,我已经做了你说的,但我得到了同样的结果
    • 等等,我的代码有问题 :) 是在错误的网站上编码
    • 看我的算法,我不知道我是否完全按照你说的那样做。
    • 不,你没有。首先,您不检查单词数组的长度(我的算法的第 3 步)。其次,只要其中一个单词与相应的前缀匹配,您就接受一个项目(如果两个单词与其相应的前缀匹配,则添加两次),而不是仅在 ALL 时添加该项目它的单词与其对应的前缀匹配。
    • 我不知道该怎么做,如果你能编辑我的代码,并发布,你会让我很开心
    【解决方案2】:

    我建议您对问题使用不同的方法。 创建一个扩展 ArrayAdapter 并实现可过滤接口的自定义适配器。

    在您的适配器中创建一个扩展过滤器的私有类;你必须重写两个方法:

    protected FilterResults performFiltering(CharSequence constraint) {.. }
    

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

    在您设置过滤规则的第一个中,您可以验证您的项目中是否包含字符串。 在第二种方法中,您发布过滤后的结果调用 notifyDataSetChanged();

    您正确添加了一个changeTextListener,但是在onTextChanged中您调用了过滤器来执行过滤操作:

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

    其中 aAdpt 是您的自定义适配器。 我希望我很清楚。有疑问可以参考我的帖子here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-17
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 2017-06-21
      • 2021-03-16
      • 2011-01-06
      • 2013-01-25
      相关资源
      最近更新 更多