2012-10-01 31 views
5

Tengo un archivo de cadena (grande) en mi aplicación que contiene una serie de caracteres aleatorios [aZ] y [0-9] pero también ";", "/" , "?", ":" y "@". Me gustaría que mi aplicación me diga la posición más cercana donde se muestran 6 dígitos consecutivamente (como "105487" o "558463").Java - Cómo buscar una cadena para 6 números aleatorios

¿Cuál sería la mejor manera de lograrlo? Gracias por investigar esto.

+0

Por favor, aclarar en "posición más cercana". ¿Es la primera ocurrencia en el archivo? –

+0

¿Significa la posición el número de línea y la columna en el archivo? –

+0

sí, quise decir la primera ocurrencia. La posición solo significa el número que la función indexOf en java daría como un número. – DVPeer

Respuesta

1

Un método eficaz sería repetir los caracteres de la cadena y probar si cada uno es un dígito. Al encontrar un partido, continúe buscando el resto de la secuencia. Algo como

int nDigits=0, i = 0; 
CharacterIterator it = new StringCharacterIterator("very long string123456"); 
for (char ch=it.first(); ch != CharacterIterator.DONE; ch=it.next()) { 
    i++; 
    nDigits = (ch.isDigit() ? nDigits++ : 0); 
    if (nDigits == 5) { 
     // DONE. Position is "i" 
    } 
} 
+0

Gracias, definitivamente intentaré esto. – DVPeer

3

Use Character.isDigit mientras itera los caracteres de la cadena y luego cuente un número hasta encontrar 6 números consecutivos o reinícielos si la secuencia se rompe. Mantenga un registro del índice y simplemente puede calcular la posición más cercana por sustracción.

Esto no es muy eficiente, pero creo que O (n) es suficiente si las cadenas no son demasiado grandes. Para la optimización, eche un vistazo a lo que Luiggi Mendoza ha sugerido en los comentarios.

+0

Gracias por su respuesta. Pensé que esta sería la única solución, pero esperaba que Java tuviera una forma más eficiente de hacerlo. Voy a mirar en esto. – DVPeer

+0

@ user1637234 puede usar una expresión regular como Lablabla ha publicado. –

+2

Puede optimizar esto: si encuentra un dígito en la posición X, entonces verifique el carácter en la posición X + 5, si ese carácter no es un dígito, entonces comience la búsqueda desde aquí. Si es un dígito, retrocede (X + 4, X + 3 ...) hasta que encuentres un no dígito y comiences de nuevo desde la posición más baja. –

4

Puede usar regex.

String regex = "(\\d{6})"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(YOU STRING HERE); 
// Check all occurrences 
while (matcher.find()) { 
    System.out.print("Start index: " + matcher.start()); 
    System.out.print(" End index: " + matcher.end()); 
    System.out.println(" Found: " + matcher.group()); 
} 

Esto haría el trabajo.

(Ejemplo de código de here)

+0

para cadenas muy grandes, probablemente fallará con OOME – jdevelop

+2

¿por qué no usar REGEX \\ d {6} en su lugar? – gtgaxiola

+0

Bueno, no sé cuánto tiempo dura la cuerda, pero creo que es una buena opción. Gracias por señalarlo. –