Java String Arraylist获取以该字符串开头的项

Java String Arraylist获取以该字符串开头的项,java,android,Java,Android,我有一个数组列表,在其中绑定数据 这是一个例子 MyStrings =new ArrayList<String>(); MyStrings.add("Dog"); MyStrings.add("Cat"); MyStrings.add("Can"); MyStrings.add("Ant"); MyStrings.add("Str"); 使用此声明 LazyAdapterGetFriends adapter2; ArrayList<String> MyStrin

我有一个数组列表,在其中绑定数据 这是一个例子

MyStrings =new ArrayList<String>();
MyStrings.add("Dog");
MyStrings.add("Cat");
MyStrings.add("Can");
MyStrings.add("Ant");
MyStrings.add("Str");
使用此声明

    LazyAdapterGetFriends adapter2;
ArrayList<String> MyStrings;
//List<String> MyStrings;
EditText filterEditText;
LazyAdapterGetFriends adapter2;
ArrayList MyStrings;
//列出mystring;
编辑文本过滤器编辑文本;
对不起,我问错了。。 愚蠢的我

列出MyStrings=newarraylist();
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());
List MySortStrings=new ArrayList(); 添加(“狗”); 添加(“猫”); 添加(“Can”); 添加(“Ant”); MyStrings.add(“Str”); 字符串sweet=“c”;
对于(int i=0;i而言,最简单的算法是您只需像这样过滤掉所有内容:

ArrayList<String> filtered = new ArrayList<String>();
for(String s : MyStrings){
if(s.substring(0,1).toLowerCase().equals("c")){
filtered.add(s);
}
}
ArrayList filtered=新建ArrayList();
for(字符串s:MyStrings){
if(s.substring(0,1).toLowerCase()等于(“c”)){
过滤。添加(s);
}
}
但是你有O(n)中的访问时间

如果您需要更快速的方法,您可能需要使用键、值结构,将键设置为需要筛选的字符串。或者,甚至可以使用,在其中您可以轻松筛选字符串中的每个字符。但是,您将需要额外的时间来构建此功能

好的,这应该是它当使用您的TextWatcher的东西(未测试…)

private List MySortStrings=new ArrayList();//假设您的数据在这里!
private List MySortedStrings=new ArrayList();//这将是排序字符串所在的列表。也许您也可以删除所有不匹配的字符串,但这取决于您的情况!
public void onTextChanged(字符序列,int start,int before,int count){
for(字符串str:MySortStrings){
if(str.startsWith(s.toString()){
MySortedStrings.add(str);
}
}
}
使用str.startsWith(字符串,int索引)


如果您想从
MyStrings
中删除不匹配的项,而不是创建一个新的
ArrayList
,索引将告诉您应该从str中的哪个索引开始比较,因为这是在迭代过程中修改
ArrayList
的唯一安全方法

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();
  }
}
myStrings=newarraylist();
添加(“狗”);
添加(“猫”);
添加(“Can”);
添加(“Ant”);
myStrings.add(“Str”);
字符串sweet=“c”;
sweet=sweet.toLowerCase();
迭代器i=myStrings.Iterator();
while(i.hasNext()){
如果(!i.next().toLowerCase().startsWith(sweet)){
i、 删除();
}
}

您也可以使用apache commons collections库:

CollectionUtils.filter(myStrings,
  new Predicate() {
    public boolean evaluate(Object o) {
       return !  ((String)o).startsWith("c");
    }
  }
};
谓词类的“evaluate”方法返回false的任何对象都将从集合中删除。请记住,与上面使用迭代器的解决方案一样,这会破坏给定的列表。如果这是一个问题,则始终可以先复制列表:

List<String> filtered = new ArrayList<String>(myStrings);
CollectionUtils.filter(filtered, ...);
List filtered=newarraylist(myStrings);
CollectionUtils.filter(已过滤,…);

我建议您按照链接进行操作,因为这可能对
循环有用
?[至少还有4个字符]使用
String.startsWith(“c”)
myString.remove(…)
用于不以“c”开头的字符串找LamdaJ看看这个我不明白问题出在哪里我只是按照你的逻辑,但很抱歉我以为它是字符串,但我发现它必须是可编辑的sweet;检查这个@Androyd什么是可编辑字符串,为什么不能使用startsWith?@reox和可编辑字符串就像一个可更改的字符串。更像是当你键入时在文本框上,可编辑字符串将捕获您键入的每个字符in@Androyd好的,但最后还是字符串类型?
CollectionUtils.filter(myStrings,
  new Predicate() {
    public boolean evaluate(Object o) {
       return !  ((String)o).startsWith("c");
    }
  }
};
List<String> filtered = new ArrayList<String>(myStrings);
CollectionUtils.filter(filtered, ...);