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のようにインデックスを取得する方法がありますか?
編集:アイテムを返すことは問題ありませんが、線形検索よりもパフォーマンスの高いものが必要です
Hermsは基本を正しく理解しました。インデックスではなく文字列が必要な場合は、Java 5foreachループを使用して改善できます。
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
}
組み込みメソッドはありますか?私が知っていることではありません。ただし、自分で行うのはかなり簡単なはずです。基本的な考え方を示す、完全にテストされていないコードを次に示します。
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ループを実行することもできます。
これはグアバのワンライナーです:
final Iterable<String> matches = Iterables.filter(myStrings, Predicates.contains(Pattern.compile("myPattern")));
for (final String matched : matches) {
...
}
これを行うためのJava APIの方法も、これを行うためのApache Commonsの方法もありません。しかし、自分でロールするのは難しいことではありません。
これはスレッドの復活になりますが、誰かに役立つかもしれません。インデックスは必要ないかもしれません。おそらく次のステップでは、正規表現に一致するアイテムに対して何かを実行するため、インデックスを要求しました。ただし、Java8ストリームとラムダ式を使用できます。
import Java.util.regex.Pattern;
import Java.util.stream.Collectors;
import Java.util.List;
...
var pattern = Pattern.compile(define); // var is Java 10 feature
List<String> list = originalList
.stream()
.filter(e -> pattern.matcher(e).matches())
.collect(Collectors.toList());
元のリストを取得してストリームに変換し、ラムダを実行してパターンに一致するフィルターを実行し、リストに戻すことができます。ただし、ストリームとして保持し、別のラムダ式を使用して.foreachを実行できます。