Einscannen bis Wort "Ende"?

2 Antworten

1)

(...) bis das Wort ende erscheint.

Ich würde dabei eigentlich auch diesen Fall einschließen:

Eingabe: Dies ist ein langer Satz mit Ende.

Das Wort ende wäre in der Eingabe enthalten. Für diese Prüfung könntest du die indexOf-Methode einsetzen.

2)

Vergleiche Strings nicht mit Vergleichsoperatoren wie != oder ==. Diese vergleichen nämlich nicht den Wert des Strings, sondern die Adressen, wo beide String-Objekte jeweils im Speicher liegen. Das heißt, zwei Strings mit dem gleichen Wert können dennoch ungleich sein.

Nutze für einen direkten Vergleich stattdessen die equals-Methode.

3)

Du solltest erst alle Eingaben in einem String bündeln und diesen dann in einem Stück in die Datei schreiben. So kannst du die einzelnen Code-Bereiche nach Funktion auftrennen und Aufwand (durch die häufigen Aufrufe von write) einsparen. Erstelle dir am besten ein StringBuilder-Objekt, bau mit diesem (in der Schleife) den zu schreibenden String zusammen und übergib das Resultat dann an den Writer.

StringBuilder data = new StringBuilder();

do {
  // ...
  data.append(eingabe);
  data.append("\r\n"); // new line
}
while (// ...

// create filewriter ...
writer.write(data.toString());    

Dein Problem sollte sich in diesem Zuge auch lösen.

4)

Fange Exceptions selbst, statt sie einfach irgendwo in die Leere zu werfen, in der Hoffnung, jemand außerhalb von main würde sich um diese kümmern. Konkret kannst du try-with-resources einsetzen. Dann brauchst du den Writer auch nicht explizit schließen, das wird implizit für dich übernommen.


cucks 
Beitragsersteller
 04.12.2019, 22:26

Der schwierige Teil für mich ist die Überprüfung unten kannst du sie mir mal ausprogrammiert zeigen ?!

0
regex9  04.12.2019, 22:38
@cucks
do {
  // ...
}
while (!eingabe.equals("ende"));
1
cucks 
Beitragsersteller
 04.12.2019, 22:50
@regex9
public class EingabeBisEnde {


	public static void main(String[] args) throws IOException {
		Scanner sc = new Scanner(System.in);
		String eingabe;
		System.out.println("Bitte geben Sie ihren Text ein: ");
		FileWriter fw = new FileWriter("C:\\Users\\Tobias\\Desktop\\ergebnis.txt");
		StringBuilder sb = new StringBuilder();
		do {
			eingabe = sc.nextLine();
			if (eingabe.equalsIgnoreCase("ende")) {
				System.out.println("Die Eingabe wurde beendet");
				sc.close();
			} else {
				sb.append(eingabe);
				sb.append("\r\n");
			}
			fw.write(sb.toString());
		} while (!eingabe.equals("ende"));


	}
}

Das ist die fertige Schleife, jedoch bekomme ich immer noch keine Ausgabe in meine Datei :(
Würde das gerne heute noch wissen, da ich morgen eine Arbeit über das Thema schreiben werde

0
cucks 
Beitragsersteller
 04.12.2019, 22:58
@cucks

Ah doch hat geklappt nachdem ich den write außerhalb der Schleife positioniert habe. Wieso brauche ich für das Ergebnis von sb.append keine zusätzliche Variable, der ich den Wert zuweise. Wusste nicht dass das so einfach geht :)

Außerdem war mir (!eingabe.equals("ende") auch neu, dass ich da einfach das ! für "kein" oder "nicht" davorsetzen darf

0
regex9  04.12.2019, 23:01
@cucks

Wenn ich es teste, passt es, bis auf den Logikfehler, dass Inhalte doppelt geschrieben werden, da du bei ende ja nicht sofort aus der Schleife ausbrichst. Der StringBuilder kann zudem seine eigentliche Wirkung nicht entfalten, da du meinen Tipp nur zur Hälfte implementiert hast. Verschiebe

fw.write(sb.toString());

hinter die Schleife und die schließe den Writer danach.

fw.close();

Wenn es bei dir nichts bringt, kannst du vor dem Schließen auch noch flush aufrufen.

0
regex9  04.12.2019, 23:08
@cucks

Der StringBuilder ist ein komplexer Typ bzw. ein Objekt, welches über append die Werte (Strings) in sich sammelt. Es ist im Prinzip fast so wie bei dem String:

String sentence = "";
sentence += word;

// comparison:
StringBuilder sentence = new StringBuilder();
sentence.append(word);

allerdings ist die obige Operation aufwendiger, da bei der Konkatenation von word und sentence wieder ein neues String-Objekt im Speicher angelegt wird. Strings sind in Java unveränderliche Objekte, daher wird das originale String-Objekt, auf welches sentence zeigt, nicht verändert, sondern einfach nur beiseite gepackt / ausgetauscht. So häufen sich String-Objekte an, die erst noch darauf warten müssen, wieder aus dem Speicher gelöscht zu werden.

Der StringBuilder verhindert dieses Anhäufen von String-Objekten.

0

eingabe wird nie ="ende" sein


RakonDark  04.12.2019, 22:11

da steht aber ungleich bzw nichtgleich

0
Zhensplitter  04.12.2019, 22:15
@RakonDark

ja aber eingabe kann niemals "ende sein wenn du eingabe nicht beim "fund = "ende" setzt

vielleicht funktioniert break;

nach sc.close();

0
Anno1602KE  04.12.2019, 22:13

Also der Code sollte stimmen sehe da keinen Fehler 🤔

0