util array java regex search arraylist

util - list object to array java



Buscar una expresión regular en una lista de arrays de Java (5)

¿Hay un método incorporado? No que yo sepa. Sin embargo, debería ser bastante fácil hacerlo usted mismo. Aquí hay un código completamente no probado que debería darle la idea básica:

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<int> getMatchingIndexes(List<String> list, String regex) { ListIterator<String> li = list.listIterator(); List<int> indexes = new ArrayList<int>(); while(li.hasNext()) { int i = li.nextIndex(); String next = li.next(); if(Pattern.matches(regex, next)) { indexes.add(i); } } return indexes }

Es posible que el uso de las partes Pattern y ListIterator sea un poco incorrecto (nunca lo he usado), pero eso debería dar la idea básica. También podría hacer un bucle for simple en lugar del bucle while sobre el iterador.

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");

Hay una manera de buscar la expresión regular bea. * Y obtener los índices como en ArrayList.indexOf?

EDITAR: devolver los artículos está bien, pero necesito algo con más rendimiento que una búsqueda lineal


Herms tiene los conceptos básicos correctos. Si desea las cadenas y no los índices, puede mejorar utilizando el bucle foreach de Java 5:

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 }


No creo que exista una forma de API de Java para hacer esto, ni hay una forma de hacerlo de Apache Commons. Sin embargo, no sería difícil hacer tu propio.


Una opción es utilizar el método Apache Commons CollectionUtils "select". Debería crear un objeto Predicado (un objeto con un único método de "evaluación" que utiliza la expresión regular para verificar una coincidencia y devolver verdadero o falso) y luego puede buscar elementos en la lista que coincida. Sin embargo, no devolverá los índices, devolverá una colección que contenga los elementos.


Este es un trazador de líneas en guayaba:

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