Samstag, 29. März 2014

All- und Any-Pattern

Gerade als Programmieranfänger muss man häufig noch über Aufgaben nachdenken, die für fortgeschrittene Programmierer schon selbstverständlich sind. Hier möchte ich nun ein paar Muster vorstellen, die immer wieder auftauchen und bei denen man sich das nachdenken sparen kann.

Ist es z.B. erforderlich zu prüfen, ob in einem Array ein Element vorkommt, dass eine bestimmte Bedingung erfüllt so, kann man das mit dem Any-Pattern testen. ich schreibe das jetzt mal in Java Syntax, obwohl es genauso gut auch für jede andere Programmiersprache funktioniert, die Arrays unterstützt. Hier ein Beispiel, bei dem festgestellt werden soll, ob ein Array eine Zahl enthält, die größer als 5 ist.

int[] werte = new int[] { 4, 2, 7, 3, 5, 1, 8 };

boolean erfuellt = false;
for (int i = 0; i < werte.length; i++) {
  if (werte[i] > 5) {
    erfuellt = true;
    break;
  }
}
if (erfuellt) {
  System.out.println("Mindestens ein Wert ist größer als 5.");
}

Hieraus lässt sich ein Muster ableiten, dass immer funktioniert, wenn man eine derartige Aufgabe vor sich hat. Man beginnt damit eine boolesche Variable auf false zu setzen. Durchläuft dann das gesamte Array und prüft jedes Mal die Bedingung, die einen interessiert. In diesem Fall, ob der Wert größer als 5 ist. Ist diese Bedingung erfüllt wird die boolesche Variable auf true gesetzt, ansonsten nicht verändert. (Das ist wichtig.) Nach Durchlaufen der Schleife kann man einfach die boolesche Variable abfragen und dann etwas tun, was für den Fall passieren soll, falls wenigstens ein Element in dem Array die Bedingung erfüllt.

Gelegentlich kann es auch vorkommen, dass man mit allen gefunden Elementen etwas tun will, dass kann man dann natürlich in dem if-Block tun. Dann sollte man allerdings auf das break verzichten, da die Aktion sonst nur für das erste gefundene Elemente ausgeführt wird.

Hier nochmal als Muster:

boolean erfuellt = false;
for (/* for-Schleife über das gesamte Array */) {
  if (/* Bedingung prüfen */) {
    /* Aktion für Elemente ausführen, die Bedingung erfüllen */
    erfuellt = true;
    break; // Falls keine Aktion durchgeführt werden soll.
  }
}
if (erfuellt) {
  // Aktion ausführen falls ein Element die Bedingung erfüllt
}

Das gleiche gibt es auch noch für den Fall, dass alle Elemente in dem Array eine Bedingung erfüllen sollen:

boolean alle = true;
for (/* for-Schleife über das gesamte Array */) {
  if (/* Bedingung prüfen */) {
    // Aktion für Elemente ausführen, die Bedingung erfüllen
  } else {
    alle = false;
    break// Falls keine Aktion durchgeführt werden soll.
  }
}
if (alle) {
  // Aktion ausführen falls alle Elemente die Bedingung erfüllen
}

Hier wird die boolesche Variable zuerst mit true initialisiert und für den Fall, dass ein Element die Bedingung nicht erfüllt auf false gesetzt.

2 Kommentare:

  1. Ich würde nach setzen der Variable die For-Schleife verlassen, weil er sonst tausende Werte prüft, obwohl man nur wissen will, ob mindestens ein Werte die Bedingung erfüllt.

    AntwortenLöschen