Java Scanner Eingabe zum String bauen

FrazeColder

Lt. Commander
Dabei seit
Okt. 2013
Beiträge
1.589
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!
 

baizon

Commander
Dabei seit
Juni 2007
Beiträge
2.084
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
 

rille

Captain
Dabei seit
März 2009
Beiträge
3.423
Habt ihr das wirklich so in der Schule beigebracht bekommen?

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


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--.
 

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.589
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");
 

Darlis

Commodore
Dabei seit
Jan. 2011
Beiträge
4.211
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?
 

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.589
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?
 

Darlis

Commodore
Dabei seit
Jan. 2011
Beiträge
4.211
Genau so wie jetzt. Die Zuweisung bleibt innerhalb der Schleife, nur die Deklaration muss nach außen.
 

baizon

Commander
Dabei seit
Juni 2007
Beiträge
2.084
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:

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.589
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);
				
			}
 

Darlis

Commodore
Dabei seit
Jan. 2011
Beiträge
4.211
Von welchem Typ ist buildingInput und was liefert dir inputBuilder.nextLine().equalsIgnoreCase(save)?
Schau dir die Lösung von baizon nochmal genau an.
 

FrazeColder

Lt. Commander
Ersteller dieses Themas
Dabei seit
Okt. 2013
Beiträge
1.589
Habs. Lag nur an der Klammer zum definieren ;)

(buildingInput = inputBuilder.nextLine()).equals(save)
 

NemesisFS

Lt. Commander
Dabei seit
Sep. 2008
Beiträge
1.289
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.
 
Top