2012-10-01 2 views
5

Ich habe eine (große) Zeichenkette in meiner Anwendung, die eine Reihe zufälliger Zeichen [aZ] und [0-9] enthält, aber auch ";", "/" , "?", ":" und "@". Ich möchte, dass meine Bewerbung mir die nächste Position mit 6 aufeinander folgenden Ziffern angibt (zB "105487" oder "558463").Java - Wie suche ich eine Zeichenkette für 6 Zufallszahlen

Was wäre der beste Weg, dies zu erreichen? Vielen Dank, dass Sie sich das angesehen haben.

+0

Bitte klären Sie auf "nächste Stellung". Ist es das erste Vorkommen in der Datei? –

+0

Bedeutet die Position Zeilennummer und Spalte in der Datei? –

+0

ja, ich meinte das erste Vorkommen. Die Position bedeutet nur die Zahl, die die indexOf-Funktion in Java als Zahl geben würde. – DVPeer

Antwort

1

Eine effektive Ansatz wäre, die Zeichen der Zeichenfolge zu iterieren und zu testen, ob jeder eine Ziffer ist. Wenn Sie eine Übereinstimmung gefunden haben, suchen Sie weiter nach dem Rest der Sequenz. Etwas wie

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

Danke, das werde ich definitiv versuchen. – DVPeer

3

Verwenden Sie Character.isDigit, während Sie die Zeichen der Zeichenfolge durchlaufen, und zählen Sie dann eine Zahl, bis Sie 6 fortlaufende Nummern gefunden haben, oder setzen Sie sie zurück, wenn die Sequenz unterbrochen wird. Verfolgen Sie den Index und Sie können einfach die nächste Position durch Subtraktion berechnen.

Dies ist nicht sehr effizient, aber ich denke O (n) ist ausreichend, wenn die Zeichenfolgen nicht zu groß sind. Zur Optimierung werfen Sie einen Blick darauf, was Luiggi Mendoza in den Kommentaren vorgeschlagen hat.

+0

Vielen Dank für Ihre Antwort. Ich dachte, dies wäre die einzige Lösung, aber ich hoffte, dass Java einen effizienteren Weg dazu hatte. Ich werde das untersuchen. – DVPeer

+0

@ user1637234 Sie könnten einen regulären Ausdruck verwenden, wie Lablabla gepostet hat. –

+2

Sie können dies optimieren: Wenn Sie eine Ziffer in Position X finden, dann überprüfen Sie das Zeichen in Position X + 5, wenn dieses Zeichen keine Ziffer ist, dann beginnen Sie von hier aus zu suchen. Wenn es eine Ziffer ist, dann gehe zurück (X + 4, X + 3 ...), bis du eine Nicht-Ziffer findest und beginne wieder an der kleinsten Stelle. –

4

Sie könnten Regex verwenden.

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

Dies würde die Aufgabe erfüllen.

(Codebeispiel von here)

+0

für sehr große Zeichenfolge wird es wahrscheinlich fehlschlagen mit OOME – jdevelop

+2

warum nicht stattdessen REGEX \\ d {6}? – gtgaxiola

+0

Nun, ich weiß nicht, wie lange die Saite ist, aber ich denke, es ist eine gute Option. Danke, dass du es aufgezeigt hast. –