Mehrere Stringwerte zum Vergleichen in if-else übergeben

Hallo,

nachdem ich Java-Anfänger den ganzen Sonntag versucht habe, die Bausteine, die ich schon gelernt hatte, zusammen zu bauen, bitte ich euch nun um Hilfe.

Die Aufgabe ist, mit if-else und system.out.println() einen Satz ausgeben zu lassen wie „Der Laden hat am von … - … Uhr auf“.

Es gibt drei verschiedene Typen von Öffnungszeiten.
Ganz am Ende bei else soll „Der Laden hat am zu.“ rauskommen.

Jetzt habe ich für jeden Wochentag einzeln das Folgende geschrieben:

if(string1.equals(Wochentag1)) {
System.out.println(„Der Laden hat am Montag von 9-11 auf.“);
}
else if(string1.equals(Wochentag2) ; {
System.out.println(„Der Laden hat am Dienstag von 17-19 auf.“);

Aber jetzt hänge ich fest. Irgendwie muss ich was in string1 rein kriegen, sonst kann ich das ja nicht vergleichen.
Wahrscheinlich durch eine Über-Methode, weil der zweite Teil der Aufgabe ist: wenn ein falscher Datentyp eingegeben wird, soll das Ding einen String mit einer Fehlermeldung printen.

Was habe ich nicht verstanden, dass ich nicht drauf komme?

Hallo nochmal,

kleiner Hint: Es gibt in Java auch switch-cases mit Strings, schau dir das mal an: https://docs.oracle.com/javase/8/docs/technotes/guides/language/strings-switch.html

Alles zusammen ist mir aber noch nicht ganz klar, was du machen möchtest. :wink:

Sollen alle Öffnungszeiten „programmatisch“ berechnet werden, mithilfe eines Algorithmus?

Schönen Abend/Advent noch und lg :sweat_smile:

Zu wissen, welche „Bausteine“ du schon gelernt hast, könnte bei einer Antwort hilfreich sein. Das, was da steht, ergibt (ohne den Rest) nicht viel Sinn. Was ist denn Wochentag1, zum Beispiel?

Poste am besten mal den Code, den du bisher hast, komplett (so dass man es compilieren kann, und/oder ggf. auch sieht, wo’s rot aufleuchtet)

Es klingt grob so, als sollte es eine Methode/Funktion geben, wie

void gibZeitenAus(...) { 
    if (...) System.out.println("...");
    ...
}

Stimmt das?

Der Code sieht schon mal ganz gut aus. Was du suchst um Wochentage vom Benutzer einzulesen ist wahrscheinlich die Scanner Klasse


Damit kannst du Benutzer Texte/Wochentage über die Konsole eingeben lassen.

Steht zu 99% irgendwo in eurem Skript.

Hallo CyborgBeta,

danke Dir. Ich befürchte, ich bin mir nicht ganz sicher, was ich machen sollte.
Hier die Angabe:

Benutzen Sie if elseAnweisungen, keine Schleifen. Nutzen Sie für die Wochentage String. Geben Sie die Wochentage als Kommandozeilenparameter an (Aufruf, kein Scanner!). Danach soll das Programm die Öffnungszeiten für den jeweiligen Tag wiedergeben, dies über System.out.println(); .
Bei fehlerhafter Eingabe soll dies als Text ausgegeben werden. Hinweise: Nutzen Sie string1.equals(string2) statt string1 == string2

In einer extra Aufgabe heißt es:

Ändern Sie Ihre Anfrage, damit Tag und Uhrzeit eingegeben werden können. Ausgegeben werden soll, ob das Geschäft zu dem Tag und der Uhrzeit auf oder zu ist. DieEin- und Ausgabe soll über die Kommandozeile erfolgen. Geben Sie die Parameter durch Leerzeichen getrennt an. Auf denzweiten Parameter können Sie mit args[1] zugreifen.

In einem dritten Aufgabenteil soll man das Ganze in switch-case umbauen.

Leider gibt es immer nur eine funktioniert/funktioniert nicht Korrektur und ich sehe nur, dass meine Lösung nicht funktioniert. Finde aber den Ansatz nicht, was ich lernen muss oder warum es nicht funktioniert hat.

Den zweiten Teil habe ich gar nicht erst versucht.

Den dritten habe ich gemacht und dachte, dass das fast leichter ist als Teil 1.

Aber ich glaube, ich krieg´s nicht hin, dass man was eingeben kann.

Das Ganze :see_no_evil:

public class A1{

public static void main (String [] args) {

  String string1 = Wochentag
  String Wochentag1 = "Montag"
  String Wochentag2 = "Dienstag"
  String Wochentag3 = "Mittwoch"
  String Wochentag4 = "Donnerstag"
  String Wochentag5 = "Freitag"
  String Wochentag6 = "Samstag" 
  
  if(string1.equals(Wochentag1)) {

System.out.println(„Der Laden hat am Montag von 9-11 auf.“);
}
else if(string1.equals(Wochentag2) ; {
System.out.println(„Der Laden hat am Dienstag von 17-19 auf.“);
//…
else {
System.out.println(„Der Laden hat zu“); };

}
}

Neu angefangen hatte ich auch nochmal, aber das schien mir noch komplizierter:

public class A1{

public static void main (String [] args) {

System.out.println(„Der Laden hat am“);
System.out.println(MethodeifWochentag());
System.out.println(„von“);
System.out.println(methodeifUhrzeit());
System.out.println(„auf.“);
}
}

Dein vorheriger Weg war schonmal im Ansatz (sogar zu 95%) richtig.
(Kleiner Tipp nebenher: Wochentag1.equals(string1) es ist nie eine schlechte Idee bei einem equals Vergleich mit einer garantierten nicht null Variablen den Vergleich darauf auszuführen, da die Reihenfolge egal ist und falls string1 null ist, kriegst du nur false statt ner NullpointerException.)

Was bei deinem Ansatz noch fehlt, ist die „Eingabe“ des Benutzers, was nicht im Programm erfolgen soll, sondern über den Aufruf: z.B. bei dem Shellbefehl ls Ordner wäre die Eingabe das „Ordner“.
Wenn du den letzten Satz der Extraaufgabe heranziehst, kommst du sicher auf die Lösung weil dort genau darauf hingewiesen wird, was du brauchst

Edit: Wenn ich sage der vorherige Weg war im Ansatz richtig, heißt es nicht dass es „schöner“ Code ist hinsichtlich der Nutzung von Methoden.

Edit2: args ist die Kurzform für Arguments

1 Like

Das, was unter „Das Ganze“ gepostet war, war gar nicht so falsch.

Die Zeile

String string1 = Wochentag

müßte

String string1 = args[0];

heißen. Das bedeutet halt: „Die Variable string1 soll den Wert haben, der beim Start an der Kommandozeile übergeben wurde“.

1 Like

5 Beiträge wurden in ein neues Thema verschoben: String-Vergleiche mit konstanten Strings

@Clayn hat vollkommen recht. Die konstanten und sicher initialisierten String-Variablen werden immer nach vorne geschrieben. Das hat neben der null-Prüfung auch den netten Effekt, dass leichter optimiert werden kann.

Die Reihenfolge ist also nicht egal, wie mrBrown schreibt, wenn man richtig programmieren möchte.

public class A1 {
	public static void main(String[] args) {
		String string1 = args.length > 0 ? args[0] : null;
		String wochentag1 = "Montag";
		String wochentag2 = "Dienstag";
		String wochentag3 = "Mittwoch";
		String wochentag4 = "Donnerstag";
		String wochentag5 = "Freitag";
		String wochentag6 = "Samstag";

		if (string1 == null) {
			System.out.println("Bitte geben Sie einen Wochentag als Parameter ein.");
		} else if (wochentag1.equals(string1)) {
			System.out.println("Der Laden hat am Montag von 9-11 auf.");
		} else if (wochentag2.equals(string1)) {
			System.out.println("Der Laden hat am Dienstag von 17-19 auf.");
		}
		// ...
		else {
			System.out.println("Der Laden hat zu.");
		}
	}
}

Ok, dann eben nicht in allen Fällen. Aber man müsste jetzt beliebig nah in die einzelnen Vorkommnisse hereinzoomen, um dazu eine „verlässliche“ Aussage treffen zu können. Wichtig ist für @Alaya aber nur zu wissen, dass es beide Möglichkeiten gibt, und welche Vor- und Nachteile jede einzelne hat… Sonst wären wir komplett offtopic.

@Alaya kannst du mit dem hier (https://forum.byte-welt.net/t/mehrere-stringwerte-zum-vergleichen-in-if-else-uebergeben/22495/11?u=cyborgbeta) gezeigten Snippet etwas anfangen? Ich hab zumidest jetzt verstanden, was du vor hast: Für einen eingegebenen Wochentag sollen die Öffnungszeiten des Ladens an diesem Wochentag ausgegeben werden…

1 Like

Um mal was zum Thema beizutragen:

Der Code von CB löst zwar die Aufgabe (obwohl wir schon hundertmal gesagt haben, dass man für Hausaufgaben keine fertigen Lösungen posten soll), das Dingens mit dem ? und dem : („ternärer Operator“) ist aber sicher nicht das richtige Level, wenn man noch bei if ist - da merkt auch jeder Leerkörper, dass da jemand Code kopiert hat.

Also, wie würde ein einfacheres Vorgehen aussehen? Zuerst einmal steckt die Eingabe im ersten Wert vom args-Array. Das Problem ist, dass jemand das Eingabe-Argument beim Programm-Aufruf vergessen haben könnte. Dann ist das Array leer, und der Zugriff auf den ersten Wert endet in einem Fehler.

Also als Erstes mit if testen, ob das Array leer ist (die Länge bekommt man über args.length), wenn ja den Nutzer informieren, was er eingeben muss, und das Programm vorzeitig mit return; beenden. Danach wissen wir, dass ein Argument übergeben wurde, also ist hinter diesem ersten Test die Zuweisung String string1 = args[0]; unproblematisch. Damit fällt auch der spätere Test auf string1 == null weg (das args-Array kann meines Wissens nach keine null-Werte enthalten).

Ich danke euch vielmals. Mit args [0] funktioniert es.
Jetzt versuche ich noch, alle Beiträge nachzuvollziehen.

NullpointerException sagt mir noch nichts. YodaConditions auch nicht.
Ich habe kurz versucht, das nachzuschauen: muss ich dafür Objektorientierung verstehen?

Arrays haben wir angeschnitten.
@CyborgBeta : den Snippet würde ich gerne verstehen, aber
args.length > 0 ? und args [0} : null
hab ich noch nie gesehen.
Ich schaue die einzelnen Teile nach und versuche dann nochmal, das zu verstehen.Jedenfalls hab ich das Gefühl, ich lerne mehr, wenn ich an einem Beispiel denke, statt 4 mini Bsp. so halb und die zwischen den theoretischen Ausführungen, die nach 2 Sekunden wieder weggeklickt sind.

@Landei: wofür teste ich, ob das Array leer ist?

NullPointerException: Bei Code wie string1.equals("Kunz") rufst du eine Methode equals an einem String-Objekt string1 auf. Nun kann in string1 sowas wie "Heinz" drinne stehen, und alles ist gut. Es gibt aber den speziellen Wert null, der für „Wert existiert nicht“ steht, und wenn der jetzt in string1 steht, führt der Methoden-Aufruf zu einem Fehler, eben der NullPointerException. Es ist eine philosophische Frage, ob es gut war, sowas wie null überhaupt zu erfinden und zuzulassen (der Erfinder selbst sagt „nein“: https://en.wikipedia.org/wiki/Tony_Hoare), aber wir müssen mit diesem Problem leben.

Zu ? und : habe ich schon geschrieben, dass das wahrscheinlich dem Lehrplan vorgreift, und wie man hier ohne auskommt. Kurz gesagt ist das so ähnlich wie if, nur dass ein Wert zurückgeliefert wird. Ich würde es erst mal ignorieren.

Das Array: Das args-Array wird mit allen Aufrufparametern gefüllt, also ein Aufruf meinProgramm param1 param2 gibt dir ein Array mit zwei Werten „param1“ und „param2“. Du brauchst hier nach Aufgabenstellung einen Parameter, das heißt, das Array muss mindestens einen Wert enthalten. Java macht das Array hier aber nur so groß, wie es muss, das heißt, wenn überhaupt kein Parameter übergeben wird, hat es die Länge null, ist also leer. Auf ein Element an einer Position zuzugreifen, die es in dem Array gar nicht gibt (also hier den Index 0 für das erste Element), führt zu einer ArrayOutOfBoundsException. Wenn du also ein Array übergeben bekommst und nicht sicher bist, ob es „groß genug“ ist, um deine Daten zu schreiben oder zu lesen, musst du vorher die Länge prüfen. Ob du es glaubst oder nicht, das war ein echter Fortschritt in der Informatik: Sprachen wie C testen die Arraygrenzen bei einem Zugriff nicht, und wenn du dort etwas „über das Ende hinaus“ in ein Array schreibst, landet es irgendwo im Speicher, der eventuell zu anderen Daten gehört. Das resultierende Chaos (und auch Sicherheitslücken) kannst du dir ungefähr vorstellen.

Lehrkörper meinst du. Ich werd mir aber nicht die Mühe machen, den Code so zu schreiben, als hätte ihn der/die TE erstellt. (Das wäre ja „Verschleierung“)

@Alaya Vergiss den Einwurf von mrBrown, der war a) nicht ganz richtig und b) wenn er doch richtig war, würde das über das Thema hinausgehen.

Mit args.length > 0 ? kannst du einfach überprüfen, ob mindestens ein Argument übergeben wurde. Das ist aber wie ein normales if.

Wenn der null-Wert eingesetzt wird, dann muss vorher noch überprüft werden, ob der Wert der Variable nicht null ist.

Lehrkörper meinst du.

Whooooosh!

Start full-offtopic:

Der war doch an Java gar nicht beteiligt. Ich würde sagen, es war gut. Andernfalls kommt doch so etwas wie funktionale Programmierung dabei heraus… :dizzy_face:

end full-offtopic.