java/android中的过滤器arraylist

java/android中的过滤器arraylist,java,android,filter,arraylist,filtering,Java,Android,Filter,Arraylist,Filtering,你好,我需要一个数组列表 我有一个阵列列表,其中包含以下项目: “你好,世界” “你好,伙计” “你好,女士” “再见,世界” “再见,伙计” “再见,女人” 然后在TextBox上我添加了一个textchanged listener(Android)。我想要的是,如果我用空格分隔写“和我”,它会显示“Hello world”和“Hello woman” 我已经为此奋斗了大约一个小时,我唯一得到的是,如果我写下“和我”,我会得到以下项目:“你好世界”、“你好男人”、“你好女人”、“再见世界”。

你好,我需要一个数组列表

我有一个阵列列表,其中包含以下项目:

“你好,世界” “你好,伙计” “你好,女士” “再见,世界” “再见,伙计” “再见,女人”

然后在TextBox上我添加了一个textchanged listener(Android)。我想要的是,如果我用空格分隔写“和我”,它会显示“Hello world”和“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));
        }
  });
et.addTextChangedListener(新的TextWatcher()
{
公共无效后文本已更改(可编辑)
{
//TextWatcher接口的抽象方法。
}
更改前的公共无效文本(字符序列,
整数开始、整数计数、整数结束)
{
//TextWatcher接口的抽象方法。
}
public void onTextChanged(字符序列、int start、int before、int count)
{
//listabusClientes=新的ArrayList();
paraulesBuscar=s.toString().split(“”;//字符串数组
sortarray=new ArrayList();//类busCliente的ArrayList
sortarray.clear();
对于(int x=0;x
编辑算法

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

                                                }
                                            }

                                        }
                                    }
paraulesBuscar=s.toString().split(“”);
sortarray=newArrayList();
sortarray.clear();
对于(int x=0;x
以下是我的做法:

  • 使用
    String.split()
    将“he wo”拆分为单词,以获得前缀数组
    [“he”,“wo”]
  • 对项目进行迭代。对于每个项目,将其拆分为单词,以获得单词数组
    [“Hello”,“World”]
  • 检查单词数组的长度是否至少与前缀数组的长度相同。如果没有,则拒绝该项目
  • 遍历前缀的索引。对于每个索引,获取前缀和单词。将单词转换成小写。检查它是否以前缀开头。所有这些方法都在String类中可用。如果不以前缀开头,则拒绝该项
  • 这应该让你开始。确保将该算法作为一个单独的方法来实现,它本身被分割成只做一件事的子方法

    编辑:

    下面是算法的最后一部分(步骤3和4):

    /**
    *说明每个前缀是否有对应的单词,如果每个单词大小写较低,
    *以相应的前缀开头。
    */
    专用布尔allPrefixesMatch(字符串[]前缀,字符串[]字){
    if(words.length
    我建议您使用不同的方法解决这个问题。 创建扩展ArrayAdapter并实现可过滤接口的自定义适配器

    在适配器中,创建扩展筛选器的私有类;您必须重写两种方法:

    protected FilterResults performFiltering(CharSequence constraint) {.. }
    

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

    您已正确添加了changeTextListener,但在ContextChanged中,您调用筛选器以执行筛选操作:

    aAdpt.getFilter().filter(s.toString());
    
    其中aAdpt是您的自定义适配器。
    我希望我是清楚的。如果你有疑问,你可以参考我的帖子。

    我也这么做了,但我得到了同样的结果等等,我只是对我的代码有点问题:)是在错误的网站上编码看到我的算法,我不知道我是否完全按照你说的做了。不,你没有。首先,不检查单词数组的长度(我的算法的第3步)。第二,当一个项目的一个单词与相应的前缀匹配时,您就接受该项目(如果两个单词与相应的前缀匹配,则添加两次),而不是仅当项目的所有单词与相应的前缀匹配时才添加该项目。如果您可以编辑我的代码并发布,你会让我很高兴的
    protected void publishResults(CharSequence constraint,
                FilterResults results) {..}
    
    aAdpt.getFilter().filter(s.toString());