你好,我需要过滤一个 ArrayList
我有一个包含以下项目的 ArrayList:
“ Hello World ” “你好伙计” “你好女人” “世界再见” “再见,男人” 《再见女人》
然后在 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));
}
}
}
}
最佳答案
我会这样做:
- 使用
String.split()
将“he wo”拆分为单词,以获得前缀数组["he", "wo"]
- 迭代项目。对于每个项目,将其拆分为单词,得到一个单词数组
["Hello", "World"]
- 检查单词数组的长度是否至少与前缀数组的长度相同。如果不是,该项目将被拒绝
- 遍历前缀的索引。对于每个索引,获取前缀和单词。将单词转换为小写。检查它是否以前缀开头。所有这些方法都在 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;
}
关于java - 在 java/android 中过滤 arraylist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16415050/