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には猫と缶が含まれています

于 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構造を使用する必要があります。または、http://en.wikipedia.org/wiki/Trieでさえ、文字列内のすべての文字を簡単にフィルタリングできます。しかし、その後、このことを構築するために余分な時間が必要になります。

さて、これはあなたのTextWatcherスタッフを使用するときのはずです(テストされていません...)

  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必要があります。これは、繰り返しながら変更する唯一の安全な方法です。IteratorArrayList

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

apachecommons-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 に答える