16
ArrayList <String> list = new ArrayList(); 
list.add("behold");
list.add("bend");
list.add("bet");
list.add("bear");
list.add("beat");
list.add("become");
list.add("begin"); 

正規表現 bea.* を検索して、ArrayList.indexOf のようにインデックスを取得する方法があります。

編集:アイテムを返すことは問題ありませんが、線形検索よりもパフォーマンスの高いものが必要です

4

7 に答える 7

19

Hermsは基本を正しく理解しました。インデックスではなく文字列が必要な場合は、Java 5 foreach ループを使用して改善できます。

import java.util.regex.Pattern;
import java.util.ListIterator;
import java.util.ArrayList;

/**
 * Finds the index of all entries in the list that matches the regex
 * @param list The list of strings to check
 * @param regex The regular expression to use
 * @return list containing the indexes of all matching entries
 */
List<String> getMatchingStrings(List<String> list, String regex) {

  ArrayList<String> matches = new ArrayList<String>();

  Pattern p = Pattern.compile(regex);

  for (String s:list) {
    if (p.matcher(s).matches()) {
      matches.add(s);
    }
  }

  return matches
}
于 2008-11-20T21:56:27.730 に答える
8

組み込みメソッドはありますか?私が知っていることではありません。ただし、自分で行うのはかなり簡単なはずです。基本的なアイデアを提供する完全にテストされていないコードを次に示します。

import java.util.regex.Pattern;
import java.util.ListIterator;
import java.util.ArrayList;

/**
 * Finds the index of all entries in the list that matches the regex
 * @param list The list of strings to check
 * @param regex The regular expression to use
 * @return list containing the indexes of all matching entries
 */
List<Integer> getMatchingIndexes(List<String> list, String regex) {
  ListIterator<String> li = list.listIterator();

  List<Integer> indexes = new ArrayList<Integer>();

  while(li.hasNext()) {
    int i = li.nextIndex();
    String next = li.next();
    if(Pattern.matches(regex, next)) {
      indexes.add(i);
    }
  }

  return indexes;
}

Pattern と ListIterator パーツの使用法が少し間違っている可能性があります (どちらも使用したことがありません) が、基本的な考え方は理解できるはずです。イテレータの while ループの代わりに単純な for ループを実行することもできます。

于 2008-11-20T21:44:06.460 に答える
4

1 つのオプションは、Apache Commons CollectionUtilsの「select」メソッドを使用することです。Predicate オブジェクト (正規表現を使用して一致をチェックし、true または false を返す単一の「評価」メソッドを持つオブジェクト) を作成する必要があります。その後、一致する項目をリスト内で検索できます。ただし、インデックスは返されず、アイテム自体を含むコレクションが返されます。

于 2008-11-20T21:44:45.710 に答える
3

これはグアバのワンライナーです:

final Iterable<String> matches = Iterables.filter(myStrings, Predicates.contains(Pattern.compile("myPattern")));

for (final String matched : matches) {
   ...
}
于 2014-06-30T09:38:39.367 に答える
1

これを行う Java API の方法や、これを行う Apache Commons の方法があるとは思いません。ただし、自分でロールするのは難しくありません。

于 2008-11-20T21:43:20.127 に答える