2016-07-22 9 views
1

Bevor wir beginnen, glaube ich nicht, dass dies eine wiederholte Frage ist. Ich habe die Frage mit dem Titel StringTokenzer countTokens() returns 1 with any string gelesen, aber das spricht nicht die Tatsache an, dass eine richtig begrenzte Zeichenfolge korrekt gezählt wird, aber eine ordnungsgemäß begrenzte Eingabe nicht.countTokens() gibt immer 1 mit Benutzereingabe zurück

Bei Verwendung der StringTokenizer-Klasse habe ich festgestellt, dass die countTokens-Methode unterschiedliche Ergebnisse zurückgibt, je nachdem, ob das Argument in countTokens eine definierte Zeichenfolge oder eine benutzerdefinierte Zeichenfolge ist. Zum Beispiel gibt der folgende Code den Wert 4.

String phrase = "Alpha bRaVo Charlie delta"; 

StringTokenizer token = new StringTokenizer(phrase); 
//There's no need to specify the delimiter in the parameters, but I've tried 
//both code examples with " " as the delimiter with identical results 

int count = token.countTokens(); 

System.out.println(count); 

Aber dieser Code den Wert 1 gedruckt werden, wenn der Benutzer eingibt: Alpha bravo Charlie Delta

Scanner in = new Scanner(System.in); 

String phrase; 

System.out.print("Enter a phrase: "); 

phrase = in.next(); 

StringTokenizer token = new StringTokenizer(phrase); 

int count = token.countTokens(); 

System.out.println(count); 
+0

Werfen Sie einfach diese da draußen (aus der [docs] (https://docs.oracle.com/javase/8/docs/api/java/util/StringTokenizer.html)): "* StringTokenizer ist eine Legacy-Klasse das wird aus Kompatibilitätsgründen beibehalten, obwohl ** seine Verwendung in neuem Code *** *** vermieden wird. Könnte in Betracht ziehen, 'String # split (String)' –

+0

zu verwenden Ich schätze die Eingabe, aber ich bin verpflichtet, die StringTokenizer-Klasse für eine Klassenzuweisung zu verwenden. –

Antwort

3

Verwendung in.nextLine() anstelle von in der nächsten();

+0

Das wird nicht funktionieren. next() und nextLine() akzeptieren String-Eingaben. Nur um sicherzugehen, dass ich es getestet habe. Keine Änderung.Mit nextLine() wird auch ein Tastaturpufferproblem eingeführt. –

+1

Es funktioniert für mich vollkommen in Ordnung. Scanner ein = neuer Scanner (System.in); String-Satz; Phrase = in.nextLine(); StringTokenizer Token = neuer StringTokenizer (Ausdruck); int Anzahl = token.countTokens(); System.out.println (Anzahl); Lauf: Alpha bRaVo Charlie-Delta BUILD ERFOLGREICH (Gesamtzeit: 19 Sekunden) – beatrice

+0

@CraigK. Der Unterschied ist, dass 'next()' abbricht, wenn es auf ein Leerzeichen stößt. 'nextLine()' nicht –

0

Scanner ein = neuer Scanner (System.in);

Zeichenfolge;

System.out.print ("Geben Sie einen Ausdruck ein:");

Satz = in.nextLine();

System.out.print (Ausdruck);

StringTokenizer Token = neuer StringTokenizer (Ausdruck);

int count = token.countTokens();

System.out.println (Anzahl);

Ausdruck drucken und überprüfen, dass in.next() "Alpha" zurückgibt.

Wie oben vorgeschlagen, verwenden Sie in.nextLine().

0

Sie könnten versuchen, eine Input, wobei anstelle des Scanners:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

String phrase = ""; 

System.out.print("Enter a phrase: "); 

try { 
    phrase = in.readLine(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

StringTokenizer token = new StringTokenizer(phrase); 

int count = token.countTokens(); 

System.out.println(count); 

nextline() der Scanner wurde auch der Job für mich getan, though.

Wenn Sie möchten, dass das Trennzeichen ein Leerzeichen ist, möchten Sie es vielleicht an den Konstruktor von StringTokenizer übergeben. Andernfalls wird "\ t \ n \ r \ f" verwendet (was das Leerzeichen einschließt, aber möglicherweise nicht wie erwartet funktioniert, wenn beispielsweise das \ n-Zeichen in der Phrase vorhanden ist).

0

Wenn Sie den Wert phrase überprüfen, nachdem Sie in.next() aufgerufen haben, sehen Sie, dass das gleich "Alpha" ist. Per Definition liest der Scanner next() das nächste Token.

Verwenden Sie stattdessen in.nextLine().

+0

Ich habe Ihren Vorschlag getestet und jetzt sehe ich den Unterschied zwischen next() und nextLine(), aber wenn ich nextLine() in meiner spezifischen Anwendung verwende, erlaubt das Programm dem Benutzer keine Eingabe einer Zeichenfolge und geht direkt zu das Ende des Programms. Ich nehme an, ich könnte eine While-Schleife mit hasNext versuchen und einen Akkumulator verwalten. –

+0

Ich hatte aufgrund meiner IDE ähnliche Probleme mit der Leseeingabe mit Scanner. Verwenden Sie eine IDE? Versuchen Sie, Ihr Programm in der Befehlszeile auszuführen. – Kyriakos

+0

Meine IDE war in der Tat fehlerhaft, ich habe das Problem behoben. –