7

我有一个绑定数据的数组列表 这是一个例子

MyStrings =new ArrayList<String>();
MyStrings.add("Dog");
MyStrings.add("Cat");
MyStrings.add("Can");
MyStrings.add("Ant");
MyStrings.add("Str");

现在我有一个字符串String sweet="c"; 现在 OI 想要的是根据我的字符串(甜)过滤该 Arraylist,因此 MyStrings 的项目将只有 Cat 和 Can

编辑 我真的很抱歉给你带来麻烦,但我的主要问题是甜蜜是可编辑的,我尝试使用此代码

      public void onTextChanged(CharSequence s, int start, int before,int count) {  
        //adapter2.getFilter().filter(s);
        //int length = filterEditText.getText().length();
        filterME  = filterEditText.getText();
        List<String> MySortStrings =new ArrayList<String>();
        for(int i=0;i<MyStrings.size();i++)
        {
            String newString = MyStrings.get(i);
            if (newString.startsWith(filterME)){

            }
        }
        //adapter2 = new LazyAdapterGetFriends(MyFriends.this,x);
         //list.setAdapter(adapter2);
    }

使用这个声明

    LazyAdapterGetFriends adapter2;
ArrayList<String> MyStrings;
//List<String> MyStrings;
EditText filterEditText;

对不起我的错误问题..愚弄我

4

6 回答 6

8
List<String> MyStrings =new ArrayList<String>();
List<String> MySortStrings =new ArrayList<String>();
MyStrings.add("Dog");
MyStrings.add("Cat");
MyStrings.add("Can");
MyStrings.add("Ant");
MyStrings.add("Str");
String sweet="c";
for(int i=0;i<MyStrings.size();i++)
{
    if(MyStrings.get(i).startsWith(sweet.toUpperCase()))
    {
        MySortStrings.add(MyStrings.get(i));
    }
}

System.out.println(MySortStrings.size());

该列表MySortStrings包含Cat & Can

于 2012-09-10T09:23:32.840 回答
1

天真的算法将是您只需像这样过滤掉所有内容:

ArrayList<String> filtered = new ArrayList<String>();
for(String s : MyStrings){
if(s.substring(0,1).toLowerCase().equals("c")){
filtered.add(s);
}
}

但是你有 O(n) 的访问时间。

如果您需要更快的方法,您可能需要使用 Key,Value 结构,并将 Key 设置为您需要过滤的字符串。甚至是http://en.wikipedia.org/wiki/Trie,您可以在其中轻松过滤字符串中的每个字符。但是你将需要额外的时间来建立这个东西。

好的,这应该是使用 TextWatcher Stuff 时的内容(未经测试...)

  private List<String> MySortStrings = new ArrayList<String>(); // assume that your data is in here!
  private List<String> MySortedStrings = new ArrayList<String>(); // this will be the list where your sorted strings are in. maybe you could also remove all strings which does not match, but that really depends on your situation!

  public void onTextChanged(CharSequence s, int start, int before,int count) {  
    for(String str : MySortStrings){
        if(str.startsWith(s.toString()){
            MySortedStrings.add(str);
        }
    }
}
于 2012-09-10T09:24:09.823 回答
1

使用 str.startsWith(String, int index)

索引会告诉你应该从 str 中的哪个索引开始比较

于 2012-09-10T09:25:56.973 回答
1

如今,您还可以使用流轻松地做到这一点:

stringList.stream().filter(s -> s.contains("c")).collect(Collectors.toList())

当您只需要知道列表中是否有包含您的字母的字符串(不是问题的一部分但非常有用)时,您可以这样做:

stringList.stream().anyMatch(s -> s.contains("c"))
于 2021-08-10T12:05:33.417 回答
0

如果要删除不匹配的项目MyStrings而不是创建新项目,ArrayList则需要使用anIteratorArrayList ,因为这是在迭代它时修改 a 的唯一安全方法。

myStrings = new ArrayList<String>();
myStrings.add("Dog");
myStrings.add("Cat");
myStrings.add("Can");
myStrings.add("Ant");
myStrings.add("Str");
String sweet="c";

sweet = sweet.toLowerCase();
Iterator<String> i = myStrings.iterator();

while (i.hasNext()) {
  if (! i.next().toLowerCase().startsWith(sweet)) {
    i.remove();
  }
}
于 2012-09-10T09:31:06.093 回答
0

您也可以使用 apache commons-collections 库:

CollectionUtils.filter(myStrings,
  new Predicate() {
    public boolean evaluate(Object o) {
       return !  ((String)o).startsWith("c");
    }
  }
};

Predicate 类的“evaluate”方法返回 false 的任何对象都将从集合中删除。请记住,就像上面使用迭代器的解决方案一样,这对给出的列表具有破坏性。如果这是一个问题,您总是可以先复制列表:

List<String> filtered = new ArrayList<String>(myStrings);
CollectionUtils.filter(filtered, ...);
于 2012-09-10T14:24:38.080 回答