Java Scanner Eingabe zum String bauen

FrazeColder

Lt. Commander
Registriert
Okt. 2013
Beiträge
1.718
Hey Community,

Ich stecke gerade an einem Problem fest...
Wir haben in der Schule die ganze Zeit eine Console Libary verwendet, mit der man per Console.readln() einfach eine Zeile unkompliziert einlesen konnte. Jetzt möchte ich aber mehrer Zeilen einlesen, was damit nicht mehr geht und habe mich deshalb mal mit dem Scanner beschäftigt.

Ich möchte, dass der Scanner solange einliest, bis z.B. der Befehl -save oder -print kommt. Das habe ich ja auch realisiert.
Allerdings hagt es bei mir jetzt beim einlesen und beim splitten. Wenn ich meinem buildingString immer scanner.nextLine zuweiße, kommt im Debugger sowas raus:

java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\.][decimal separator=\,][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Q∞\E]

Wie bekomme ich jetzt NUR DIE Eingabe raus?
Die war eben:

Dann sollen alle Zeile/Links zu einer ArrayList hinzugefügt werden. Da habe ich mir gedacht, splitte ich einfach jeweils nach "https://" und füge dann den Link zur ArrayList hinzu. Allerdings geht das nicht.. :/

Wie bekomme ich beim Scanner nur die Eingabe heraus um die zum buildingString hinzuzufügen und nicht so ein komisches etwas?

Code:
String help = new String("-help");
		String print = new String("-print");
		String clear = new String("-clear");
		String save = new String("-save");

		while (true) {
			
			Scanner inputBuilder = new Scanner(System.in);
			String buildingInput = new String();
		
			while(inputBuilder.nextLine() != save || inputBuilder.nextLine() != clear || inputBuilder.nextLine() != print || inputBuilder.nextLine() != help){
				buildingInput = buildingInput + inputBuilder;
			}
			
			StringTokenizer tokenizer = new StringTokenizer(buildingInput, "https://");
			
			for(int i = 0; i < tokenizer.countTokens(); i++){
				linkList.add(tokenizer.nextToken());
			}

MfG und Danke!
 
2 Fehler:
1. Zeile 11 ist falsch, da erst 4x eingelesen werden muss, bevor geprüft wird. Da müsste erst eine Zuweisung stattfinden, dann der check:
Code:
String x = inputBuilder.nextLine();
if (x.equals(save) || x.equals(clear) || x.equals(print) || x.equals(help)) {
 break;
} else {
 buildingInput = buildingInput + x;
}
2. Der Code kommt daher, dass du den Scanner ausgibst (inputBuilder, Zeile 12) und nicht den String. Das wird mit meiner 1. Lösung auch behoben
 
FrazeColder schrieb:
Code:
String help = new String("-help");
Habt ihr das wirklich so in der Schule beigebracht bekommen?

Besser wäre:
Code:
(public) static final String HELP = "-help";



FrazeColder schrieb:
Code:
while(inputBuilder.nextLine() != save || 
    inputBuilder.nextLine() != clear || 
    inputBuilder.nextLine() != print || 
    inputBuilder.nextLine() != help)
Was passiert denn wenn du nextLine() insgesamt 4-mal aufrufst? Kleiner Tipp: http://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html#nextLine--.
 
Okay, vielen Danke!
Und nein, habe das gerade nur zu Entwicklungszwecken noch!

Aber wieso sagt er, dass ich die einen String mit dem Namen "temp" erstellen soll?
Anderes kann ich mein Problem doch gar nicht lösen?!

Code:
			do{
				String temp = new String(inputBuilder.nextLine());
				buildingInput = buildingInput + temp;
				
			}while(temp != "-save" || temp != "-save" || temp != "-save" || temp != "-save");
 
Da ist schon wieder dieses "new String"
Stringvergleiche mit == bzw. != funktionieren in Java nicht so, wie du dir das vorstellst. Verwende equals.
temp liegt in der while-Schleife außerhalb des Gültigkeitsbereiches {Scope}, daher die Meldung. Du musst temp außerhalb der Schleife deklarieren.
Dass 4x "-save" ist sicher ein Copy&Paste-Fehler?
 
Wenn ich es aber außerhalb der schleife deklariere, wie soll ich dann die schleife so oft durchlaufen, bis ich bei einem Befehl, z.B. -save, angekommen bin?

Woher weiß ich, wie oft ich die schleife durchlaufen lassen muss?
 
Genau so wie jetzt. Die Zuweisung bleibt innerhalb der Schleife, nur die Deklaration muss nach außen.
 
So:
Code:
String line = "";
while ((line = inputBuilder.nextLine()).equals(save) || line.equals(clear) || line.equals(print) || line.equals(help)) {
 ...
}
Edit: Oder wie eben beschrieben von Darlis, da es lesbarer und "schöner" ist.
 
Zuletzt bearbeitet:
Danke!
Ergänzung ()

Ich verstehe gerade meinen Fehler nicht?!

Type mismatch: cannot convert from String to boolean

Code:
 	while(buildingInput = inputBuilder.nextLine().equalsIgnoreCase(save) || buildingInput.equalsIgnoreCase(print)|| buildingInput.equalsIgnoreCase(clear) || buildingInput.equalsIgnoreCase(help)){
			
				linkList.add(buildingInput);
				
			}
 
Von welchem Typ ist buildingInput und was liefert dir inputBuilder.nextLine().equalsIgnoreCase(save)?
Schau dir die Lösung von baizon nochmal genau an.
 
Habs. Lag nur an der Klammer zum definieren ;)

(buildingInput = inputBuilder.nextLine()).equals(save)
 
Ich würde das ganze so anstellen:
Code:
private static final Pattern END_OF_INPUT_PATTERN = Pattern.compile("-(help|test|clear|print)", Pattern.INSENSITIVE_CASE);
...
final StringBuilder sb = new StringBuilder();
while (!scanner.hasNext(END_OF_INPUT_PATTERN)) {
     sb.append(scanner.nextLine());
}
scanner.close();
return sb.toString();

Benutzt den StringBuilder um den String effizient zu bauen und ist vergleichsweise lesbar.
 
Zurück
Oben