2012-10-01 14 views
5

Ho un file di stringa (grande) nella mia applicazione che contiene una serie di caratteri casuali [aZ] e [0-9] ma anche ";", "/" , "?", ":" e "@". Vorrei che la mia applicazione mi indicasse la posizione più vicina in cui vengono visualizzate 6 cifre consecutive (come "105487" o "558463").Java - Come cercare una stringa per 6 numeri casuali

Quale sarebbe il modo migliore per raggiungere questo obiettivo? Grazie per aver esaminato questo.

+0

Si prega di chiarire on "più vicino". È la prima occorrenza nel file? –

+0

La posizione indica il numero di riga e la colonna nel file? –

+0

sì, intendevo il primo tentativo. La posizione indica semplicemente il numero che la funzione indexOf in java darebbe come numero. – DVPeer

risposta

1

Un efficace approccio sarebbe quello di iterare i caratteri della stringa e testare se ciascuna è una cifra. Dopo aver trovato una corrispondenza, continua a cercare il resto della sequenza. Qualcosa come

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

Grazie, lo proverò sicuramente. – DVPeer

3

Utilizzare Character.isDigit durante l'iterazione dei caratteri della stringa e quindi contare un numero fino a quando non sono stati trovati 6 numeri consecutivi o ripristinati se la sequenza si interrompe. Tieni traccia dell'indice e puoi semplicemente calcolare la posizione più vicina per sottrazione.

Questo non è molto efficiente, ma penso che O (n) sia sufficiente se le stringhe non sono troppo grandi. Per l'ottimizzazione date un'occhiata a cosa ha suggerito nei commenti Luiggi Mendoza.

+0

Grazie per la risposta. Pensavo che questa sarebbe stata l'unica soluzione, ma speravo che Java avesse un modo più efficiente di farlo. Lo esaminerò. – DVPeer

+0

@ user1637234 potresti usare un'espressione regolare come Lablabla ha pubblicato. –

+2

Puoi ottimizzare questo: se trovi una cifra nella posizione X, controlla il personaggio nella posizione X + 5, se quel carattere non è una cifra, quindi inizia a cercare da qui. Se è una cifra, torna indietro (X + 4, X + 3 ...) finché non trovi una cifra e ricomincia dalla posizione minima. –

4

È possibile utilizzare 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()); 
} 

Questo farebbe il lavoro.

(codice di esempio da here)

+0

per stringhe molto grandi che probabilmente falliranno con OOME – jdevelop

+2

perché non usare REGEX \\ d {6}? – gtgaxiola

+0

Beh, non so quanto sia lunga la stringa, ma penso che sia una buona opzione. Grazie per averlo fatto notare però. –