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
siehe Int-Zufallswerte in beliebigem Bereich.
und Double-Zufallswerte in beliebigem Bereich (float
analog)
Erstellen einer Zufallszahl (int
, float
, etc.) in frei definierbarem Wertebereich sollte gekonnt werden.
4. Scanner
siehe Zahlen einlesen mit 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
ist0
-
Wenn komplett voll:
freeIdx
isttheArray.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
(abfreeIdx
"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!