Streams
parent
e8bf9ff614
commit
2ce49eff15
|
@ -2,7 +2,7 @@ package Algorithmus.SortierAlgorithmus;
|
||||||
|
|
||||||
public class MergeSort {
|
public class MergeSort {
|
||||||
/* - Zeitkomplexität von O(n log n)
|
/* - Zeitkomplexität von O(n log n)
|
||||||
* - Raumkomplexität O(n)
|
* - Raumkomplexität(Space) O(n)
|
||||||
* - prinzip Divide (Teilen) und Conquer (Zusammenfügen)
|
* - prinzip Divide (Teilen) und Conquer (Zusammenfügen)
|
||||||
* Divide (Teilen): Das Array wird rekursiv in zwei Hälften geteilt, bis jede Teilmenge nur noch ein einziges Element enthält.
|
* Divide (Teilen): Das Array wird rekursiv in zwei Hälften geteilt, bis jede Teilmenge nur noch ein einziges Element enthält.
|
||||||
* Conquer (Zusammenfügen): Die kleineren Teilmengen werden dann wieder zusammengeführt und dabei sortiert, um schließlich das vollständig sortierte Array zu erhalten.
|
* Conquer (Zusammenfügen): Die kleineren Teilmengen werden dann wieder zusammengeführt und dabei sortiert, um schließlich das vollständig sortierte Array zu erhalten.
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
package Algorithmus.SortierAlgorithmus;
|
||||||
|
|
||||||
|
public class QuickSort {
|
||||||
|
/* - Zeitkomplexität von O(n log n) im Durchschnitt und O(n^2) im schlechtesten Fall
|
||||||
|
* - Raumkomplexität (Space) O(log n) für den Aufrufstack bei der rekursiven Implementierung
|
||||||
|
* - Prinzip: Divide (Teilen) und Conquer (Erobern)
|
||||||
|
* Divide (Teilen): Wähle ein Pivot-Element und teile das Array in zwei Teile:
|
||||||
|
* - Elemente kleiner als das Pivot auf der linken Seite,
|
||||||
|
* - Elemente größer als das Pivot auf der rechten Seite.
|
||||||
|
* Conquer (Erobern): Wende Quick Sort rekursiv auf die beiden Teilarrays an.
|
||||||
|
* - Keine explizite Merge-Phase: Im Gegensatz zu Merge Sort führt Quick Sort das Sortieren während des Teilens durch, daher gibt es keine separate Zusammenführungsphase.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int arr[] = {12, 11, 13, 5, 6, 7}; // Initialisiere ein Array mit unsortierten Werten
|
||||||
|
quickSort(arr, 0, arr.length - 1); // Rufe Quick Sort auf dem gesamten Array auf
|
||||||
|
|
||||||
|
// Ausgabe des sortierten Arrays
|
||||||
|
System.out.println("Sortiertes Array:");
|
||||||
|
for (int i : arr)
|
||||||
|
System.out.print(i + " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quick Sort Methode
|
||||||
|
public static void quickSort(int arr[], int anfang, int end) {
|
||||||
|
if (anfang < end) { // Bedingung zur Fortsetzung der Rekursion, solange das Teilarray mehr als ein Element enthält
|
||||||
|
int pivo = partition(arr, anfang, end); // Finde das Pivot-Element und teile das Array
|
||||||
|
quickSort(arr, anfang, pivo - 1); // Sortiere das linke Teilarray
|
||||||
|
quickSort(arr, pivo + 1, end); // Sortiere das rechte Teilarray
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Partitionierungsfunktion, die das Array um das Pivot-Element herum aufteilt
|
||||||
|
static int partition(int arr[], int anfang, int end) {
|
||||||
|
int pivo = anfang; // Wähle das erste Element als Pivot
|
||||||
|
while (true) { // Endlosschleife, die durch 'break' unterbrochen wird
|
||||||
|
// Finde die Position von 'end' für den ersten Wert, der kleiner ist als das Pivot
|
||||||
|
while (arr[pivo] <= arr[end] && pivo != end)
|
||||||
|
end--; // Bewege den 'end'-Zeiger nach links
|
||||||
|
|
||||||
|
if (pivo == end) // Wenn 'pivo' und 'end' gleich sind, ist die Partitionierung abgeschlossen
|
||||||
|
break;
|
||||||
|
else if (arr[pivo] > arr[end]) { // Wenn das Pivot größer ist, tausche die Werte
|
||||||
|
int temp = arr[end]; // Tausche den Wert von arr[pivo] mit arr[end]
|
||||||
|
arr[end] = arr[pivo];
|
||||||
|
arr[pivo] = temp;
|
||||||
|
pivo = end; // Setze 'pivo' auf die neue Position
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finde die Position von 'anfang' für den ersten Wert, der größer ist als das Pivot
|
||||||
|
while (arr[pivo] >= arr[anfang] && pivo != anfang)
|
||||||
|
anfang++; // Bewege den 'anfang'-Zeiger nach rechts
|
||||||
|
|
||||||
|
if (pivo == anfang) // Wenn 'pivo' und 'anfang' gleich sind, ist die Partitionierung abgeschlossen
|
||||||
|
break;
|
||||||
|
else if (arr[pivo] < arr[anfang]) { // Wenn das Pivot kleiner ist, tausche die Werte
|
||||||
|
int temp = arr[anfang]; // Tausche den Wert von arr[pivo] mit arr[anfang]
|
||||||
|
arr[anfang] = arr[pivo];
|
||||||
|
arr[pivo] = temp;
|
||||||
|
pivo = anfang; // Setze 'pivo' auf die neue Position
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pivo; // Gib die neue Position des Pivot-Elements zurück
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -72,7 +72,7 @@ public class ExceptionHandling {
|
||||||
//also Objekt ist leer!
|
//also Objekt ist leer!
|
||||||
try {
|
try {
|
||||||
int[] arr = null;
|
int[] arr = null;
|
||||||
System.out.println(arr[4]);
|
//System.out.println(arr[4]); fehler
|
||||||
}catch(Exception e) {
|
}catch(Exception e) {
|
||||||
|
|
||||||
System.out.println(e.toString());
|
System.out.println(e.toString());
|
||||||
|
|
|
@ -52,7 +52,8 @@ public class Finally {
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
}finally {
|
}finally {
|
||||||
return 3;
|
System.out.println("tu etwas");
|
||||||
}
|
}
|
||||||
|
return x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
package streams;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.*;
|
||||||
|
|
||||||
|
public class Beispiele {
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Integer[] myArray = new Integer[]{10,20,22,30,50};
|
||||||
|
Stream<Integer> myStream = Arrays.stream(myArray);
|
||||||
|
/*
|
||||||
|
* Hier macht der Stream nichts, weil die Intermediate-Operation filter
|
||||||
|
* keine Aktion auslöst, solange keine Terminal-Operation aufgerufen wird.
|
||||||
|
*/
|
||||||
|
myStream.filter(i -> (i % 2 == 0));//Keine Wirkung, da keine Terminal-Operation folgt
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Hier wird eine Intermediate-Operation (filter) auf dem Stream aufgerufen,
|
||||||
|
* die die geraden Zahlen aus dem Stream herausfiltert.
|
||||||
|
* Danach wird die Terminal-Operation count() aufgerufen, die die Anzahl der
|
||||||
|
* gefilterten Elemente zählt und als long zurückgibt.
|
||||||
|
*/
|
||||||
|
long x = myStream.filter(i -> (i % 2 == 0)).count(); // count gibt Long zurück
|
||||||
|
System.out.println(x);
|
||||||
|
|
||||||
|
// Wiederverwendung von myStream liefert einen Compiler-Fehler, da der Stream bereits abgeschlossen ist.
|
||||||
|
// Ein Stream kann nur einmal verwendet werden, und nach einer Terminal-Operation wie count()
|
||||||
|
// ist der Stream geschlossen und nicht wiederverwendbar.
|
||||||
|
x = myStream.filter(i -> (i % 2 == 1)).count(); // Compiler-Fehler
|
||||||
|
System.out.println(x);
|
||||||
|
|
||||||
|
// Compiler-Fehler: Stream has already been operated upon or closed
|
||||||
|
// Dieser Fehler tritt auf, weil myStream nach der ersten count()-Operation nicht erneut verwendet werden kann.
|
||||||
|
long y = myStream.filter(i -> (i % 2 == 1)).count(); // Compiler-Fehler
|
||||||
|
System.out.println(y);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package streams;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class Beispiele2 {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
Integer[] myArray = new Integer[]{10,20,22,30,50};
|
||||||
|
Stream<Integer> myStream = Arrays.stream(myArray);
|
||||||
|
// entweder
|
||||||
|
myStream.sorted().forEach(System.out::println);;
|
||||||
|
|
||||||
|
//oder
|
||||||
|
myStream.forEach(i -> System.out.println(i));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package streams;
|
||||||
|
|
||||||
|
/* Was ist das?
|
||||||
|
* - Arbeitet mit einer Vielzahl von Datenquellen
|
||||||
|
* . Collections (List, Set, Map, etc.)
|
||||||
|
* . Arrays
|
||||||
|
* . Stream von Dateien (File IO)
|
||||||
|
* . ArrayList, LinkedList, etc.
|
||||||
|
*
|
||||||
|
* - keine Notwendigkeit von loops
|
||||||
|
* - Kein Speichern: Streams speichern keine Daten, sondern leiten sie von einer Quelle ab.
|
||||||
|
* - Lazy Evaluation: Operationen werden erst ausgeführt, wenn eine Terminal-Operation aufgerufen wird.
|
||||||
|
* - Einmalige Verwendung: Ein Stream kann nur einmal verwendet werden.
|
||||||
|
* . Alternative Möglickeit eine andere Stream für das Selbe List ertsellen
|
||||||
|
* Sobald ein Stream verarbeitet wurde, kann er nicht erneut verwendet werden.
|
||||||
|
* - Streams können grundsätzlich überall in einer Java-Klasse verwendet werden
|
||||||
|
* , einschließlich in Methoden, Konstruktoren und anderen Bereichen, solange die Datenquelle und
|
||||||
|
* die notwendigen Imports vorhanden sind.
|
||||||
|
*
|
||||||
|
* . Stream-Operationen: (Siehe Bild)
|
||||||
|
* 1. Intermediate (Zwischenoperationen)
|
||||||
|
* - transformieren einen Stream in einen anderen Stream.
|
||||||
|
* - sie werden erst ausgeführt, wenn eine Terminal-Operation aufgerufen wird.
|
||||||
|
*
|
||||||
|
* 2. Terminal-Operationen (Siehe Bild)
|
||||||
|
* - schließen den Stream ab und liefern ein Ergebnis oder eine Nebenwirkung.
|
||||||
|
*
|
||||||
|
* Hinweis:
|
||||||
|
* - Streams in Java arbeiten hauptsächlich mit (Objekten) und nicht direkt mit (primitiven) Datentypen
|
||||||
|
* - für (primitiven) Datentypen :
|
||||||
|
* . IntStream für int
|
||||||
|
* . LongStream für long
|
||||||
|
* . DoubleStream für double
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
public class Streams {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue