Lernstoff 1xHIF für PLF im April 2023

Themen (Stoff von SMK + Array-Füllstand/FreeIdx + Sortieren):

Packages, Konstante, Random, Scanner, Arrays Basics, Array-Container mit LEER_WERT, Array-Container lückenlos gefüllt mit Füllstand/FreeIdx, Array Sortieren mit Selection Sort, Bubble Sort

1. Packages

Siehe auch Basics Packages.

Ganz oben steht normalerweise (wenn nicht – wie bisher bei uns üblich – das Default-Package verwendet wird) die Package-Deklaration der eigenen Klasse:
package my.own.pkg;

Danach (noch oberhalb des Klassen-Kopfes) die Importe:
import java.util.Random; // wenn benötigt
import java.util.Scanner; // wenn benötigt

Alle Klassen aus Package java.lang werden automatisch importiert – z.B.

  • java.lang.System

  • java.lang.String

  • java.lang.Math

  • Die Wrapper-Klassen aller primitiven Datentypen

(Zusatz-Info: Auch das Package des aktuellen Java-Files wird automatisch importiert, daher können alle Klassen aus dem selben Package mit dem "nackten" Klassennamen ohne Package aufgerufen werden.)

Wenn man möchte, kann man trotz Import auch den voll qualifizierten Namen verwenden:
java.lang.System.out.println("wie unnötig!");
Wenn zwei verschiedene Klassen mit dem selben "SimpleName" (z.B. Point) in einer Klasse benutzt werden, MUSS IMMER deren voll qualifizierter Name verwendet werden.

2. Konstante

Siehe auch Basics Konstante.

Konstante werden definiert wie folgt:
public static final String MUSTER_TEXT = "Das ist ein Text";
public static final boolean CLOSED = true; Sichtbarkeit kann gelegentlich auch private sein, wenn sinnvoll. Jeder Datentyp ist erlaubt - auch Klassen:
public static final Person MUSTERMANN = new Person("Max", "Mustermann", 'm', 40);

Für alle primitiven Datentypen gibt es in der dazugehörigen Wrapper-Klasse Konstante für z.B. größten und kleinsten darstellbaren Wert: Integer Achtung: bei float, double ist MIN_VALUE nicht der negativste Wert, sondern der kleinste von 0 unterscheidbare POSITIVE Wert!
Daher entweder Float.MAX_VALUE oder – wenn er negativ sein soll – MINUS davor, also:
float mostNegative = -Float.MAX_VALUE;

3. Random

Erstellen einer Zufallszahl (int, float, etc.) in frei definierbarem Wertebereich sollte gekonnt werden.

4. Scanner

Einlesen von beliebigem Text erfordert keine vorherige Prüfung analog zu hasNextInt() etc. und kein Eliminieren der falschen Eingabe.

5. Arrays Basics

Gekonnt werden sollte:

  • Arrayvariable deklarieren (zeigt auf null):
    float[] values1; // values1 zeigt auf null

  • Array erzeugen mit Kapazitätsangabe und einer Arrayvariablen zuweisen:
    values1 = new float[5]; // Werte in den Zellen für float: 0.0f

  • Array direkt bei Variablendeklaration mit Werteliste erzeugen:
    float[] values2 = {-1.1f, 17, 0, 33.3f};

  • Array später mit konkreten Werten erzeugen:
    float[] values3;
    values3 = new float[] {-5.5f, 0f, 22.2f};

  • Array-Länge kann abgefragt werden mit:
    System.out.println("Values1-Länge: " + values1.length); // hier 5
    System.out.println("Values2-Länge: " + values2.length); // hier 4

  • Array für einen Array-Parameter direkt beim Methodenaufruf erzeugen:
    public void workWithValues(float[] values) { /* …​ Implementation …​ */ }
    workWithValues(new float[] {-1.1f, 0, 33.3f}); // AUFRUF mit Array-Erzeugung

  • Array als ganzes einer Arrayvariablen zuweisen
    float[] values4 = values3;

  • Array-Zelle schreiben: values4[1] = -22.22f;

  • Array-Zelle lesen:
    System.out.println("Values4[1]: " + values4[1]); // Ausgabe: "Zelle 1: -22.22"

  • Nicht-null-Prüfung von Array-Variablen und Rückgabewerten vor Nutzung:
    if (values4 != null) { values4[1] = 99.99f; }

6. Array als Container mit LEER_WERT

  • LEER_WERT definieren, Array-Erzeugung, danach Initialisierung mit LEER_WERT:
    public static final float LEER_WERT = Float.MAX_VALUE;
    float[] values5 = new float[5];
    for (int i=0; i<values5.length; i++) { values5[i] = LEER_WERT; }

  • Zuweisung gültiger Werte:
    values5[1] = 33.3f;

  • Prüfung vor Nutzung:
    if (values5[1] != LEER_WERT) { System.out.println("values5[1] ok: " + values5[1]); }

  • Zelle "löschen":
    values5[1] = LEER_WERT;

7. Array als lückenlos gefüllter Container mit Füllstand/FreeIdx

Zentrales Konzept: Array ist bis zum aktuellen Füllstand LÜCKENLOS gefüllt.
Füllstand = Anzahl enthaltener Elemente = Erster ungenutzter Index = FreeIdx

Wichtige Hinweise:

  • Wenn leer: freeIdx ist 0

  • Wenn komplett voll: freeIdx ist theArray.length

  • bei hinzufügen: freeIdx++;

  • bei Element entfernen: freeIdx--;

  • bei Einfügen irgendwo (insert(idx, value);):

    • idx >= 0

    • idx <= freeIdx

    • Array nicht voll

    • vorher ab idx alle Werte um 1 nach oben schieben (beginnend von "oben")

  • bei Entfernen irgendwo (remove(idx);):

    • idx >= 0

    • idx < freeIdx (ab freeIdx "Müllhalde")

    • Array nicht leer

    • alle "rechten" Elemente (mit größerem Index) um 1 nach unten schieben (von unten beginnend)

8. Arrays Sortieren mit Selection Sort, Bubble Sort

Beide Algorithmen sind leicht verständlich, sie bestehen aus wiederholter Anwendung von 2 Operationen. Eine davon – das Tauschen der Werte an 2 gegebenen Indices – ist für beide gleich.

8.1. Selection Sort

siehe Selection Sort
Hier ist das Finden des Index des kleinsten Wertes ab einem schrittweise ansteigenden Index-Parameter die wiederholt auszuführende Haupt-Operation.

8.2. Bubble Sort

siehe Bubble Sort
Hier werden von "links" kommend alle Nachbarn so getauscht, dass der linke kleiner ist. Sobald bei einem solchen Durchlauf kein einziger Tausch mehr nötig war, ist die Sortierung erledigt.

9. Unit-Testing (notfalls Test-Klasse)

Siehe Unit-Testing

Notfalls kann auch eine normale Testklasse geschrieben werden.

Dies ist jedoch aufwändiger und liefert nicht die volle Punkte-Zahl!