This repository contains my solutions and progress for the university course "Algorithmen und Datenstrukturen" (Algorithms and Data Structures).
Educational repository documenting my work throughout the semester, including:
- Lecture exercises (e1-e14)
- Implementation of various data structures and algorithms
- Solutions to programming assignments
- Binary Search
- AVL Trees
- AB Trees
- Hash Tables (Simple Hashing with Chaining, Double Hashing)
- Graph Algorithms (BFS, Dijkstra, Connected Components)
All implementations are written in Java using Gradle as the build system.
Gradle ist ein Build-Automatisierungstool für Java-Projekte (und andere Sprachen).
Hauptfunktionen:
- Dependency Management: Verwaltet externe Bibliotheken automatisch
- Build Automation: Kompiliert Code, führt Tests aus, erstellt JARs
- Task-basiert: Definiert wiederverwendbare Build-Schritte
- Konvention über Konfiguration: Standard-Projektstruktur vorgegeben
Vergleich zu Alternativen:
- Maven: XML-basiert, strenger, verbose
- Gradle: Groovy/Kotlin-basiert, flexibler, moderner
Gradle vs. Maven vs. Manuell:
Manuell:
├─ Bibliotheken selbst herunterladen
├─ Classpath manuell setzen
└─ Kompilierung per javac-Befehle
Maven/Gradle:
├─ Bibliotheken automatisch heruntergeladen
├─ Standardisierte Projektstruktur
└─ Ein Befehl für Build/Test/Package
-
build.gradle(.kts): Haupt-Konfigurationsdatei
- Definiert Projekt-Metadaten
- Dependencies
- Tasks
- Plugins
-
settings.gradle(.kts): Projekt-Einstellungen
- Projektname
- Multi-Modul-Projekte
-
gradle/wrapper: Gradle Wrapper
- Garantiert gleiche Gradle-Version für alle Entwickler
- Kein globales Gradle-Installation nötig
-
Standard-Verzeichnisstruktur:
projekt/
├── src/
│ ├── main/
│ │ ├── java/ # Produktionscode
│ │ └── resources/ # Ressourcen (configs, etc.)
│ └── test/
│ ├── java/ # Test-Code
│ └── resources/ # Test-Ressourcen
├── build.gradle # Build-Konfiguration
├── settings.gradle # Projekt-Settings
└── gradle/ # Gradle Wrapper Files
- Starte IntelliJ IDEA
- Wähle "New Project"
Im "New Project" Dialog:
┌─────────────────────────────────────────┐
│ Name: datenstrukturen-uebungen │
│ Location: /pfad/zu/deinem/verzeichnis │
│ │
│ Language: Java │
│ Build System: Gradle │
│ │
│ JDK: 17 (oder höher) │
│ [Falls nicht vorhanden: Download JDK] │
│ │
│ Gradle DSL: Groovy (oder Kotlin) │
│ │
│ [X] Add sample code │
│ │
│ Advanced Settings: │
│ GroupId: de.fernuni.datenstrukturen │
│ ArtifactId: uebungen │
│ │
│ [Create] │
└─────────────────────────────────────────┘
Einstellungen erklärt:
- Name: Projektname (frei wählbar)
- Build System: Gradle auswählen
- JDK: Java Development Kit (mindestens Version 11, empfohlen 17+)
- Gradle DSL:
- Groovy: Traditionell, mehr Beispiele online
- Kotlin: Moderner, type-safe
- GroupId: Namespace (z.B. deine Uni-Domain rückwärts)
- ArtifactId: Projekt-Identifier
Nach dem Erstellen:
- IntelliJ lädt Gradle herunter (falls nötig)
- Projekt-Struktur wird initialisiert
- Dependencies werden heruntergeladen
- Status unten rechts: "Gradle sync in progress..."
Warte bis "Gradle sync completed" erscheint!
Deine Struktur sollte so aussehen:
datenstrukturen-uebungen/
├── .gradle/ # Gradle Cache (ignorieren)
├── .idea/ # IntelliJ Konfiguration (ignorieren)
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── src/
│ ├── main/
│ │ ├── java/ # HIER: Produktionscode
│ │ └── resources/
│ └── test/
│ ├── java/ # HIER: Test-Code
│ └── resources/
├── .gitignore # Git Ignore File
├── build.gradle # Gradle Build Config
├── gradlew # Gradle Wrapper (Unix)
├── gradlew.bat # Gradle Wrapper (Windows)
└── settings.gradle # Projekt Settings
Öffne build.gradle und stelle sicher, dass es so aussieht:
plugins {
id 'java'
}
group = 'de.fernuni.datenstrukturen'
version = '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
// JUnit 5 für Tests
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
// Java Version
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
// Test Configuration
test {
useJUnitPlatform()
}Wichtige Sections erklärt:
- plugins: Aktiviert Java-Plugin
- repositories: Wo Dependencies heruntergeladen werden
- dependencies: Externe Bibliotheken (hier JUnit für Tests)
- java.toolchain: Welche Java-Version verwendet wird
- test: Test-Konfiguration
Im Project Explorer (links):
- Rechtsklick auf
src/main/java - New → Package
- Name:
de.fernuni.datenstrukturen.lektion2 - Enter
Wiederhole für Tests:
- Rechtsklick auf
src/test/java - New → Package
- Name:
de.fernuni.datenstrukturen.lektion2
Ergebnis:
src/
├── main/
│ └── java/
│ └── de/
│ └── fernuni/
│ └── datenstrukturen/
│ └── lektion2/
│ # Hier: Deine Implementierungen
└── test/
└── java/
└── de/
└── fernuni/
└── datenstrukturen/
└── lektion2/
# Hier: Deine Tests
Test-Driven Development Ansatz:
- Rechtsklick auf
src/test/java/.../lektion2 - New → Java Class
- Name:
ListTest - Enter
Option 1: Über UI
- Rechtsklick auf Test-Klasse → "Run 'ListTest'"
- Oder: Grüner Play-Button neben Klasse/Methode
Option 2: Gradle Task
- Rechts: "Gradle" Tab öffnen
Tasks → verification → testdoppelklicken
Option 3: Terminal
./gradlew testRepository initialisieren:
- VCS → Enable Version Control Integration
- Git auswählen → OK
- VCS → Commit (oder Ctrl+K)
- Initial commit durchführen
GitHub Repository erstellen:
- Auf GitHub.com: "New Repository"
- Name:
datenstrukturen-uebungen - NICHT mit README initialisieren
- Create Repository
Remote hinzufügen:
# Im IntelliJ Terminal (unten):
git remote add origin https://github.com/DEIN_USERNAME/datenstrukturen-uebungen.git
git branch -M main
git push -u origin mainOder über IntelliJ UI:
- VCS → Git → Remotes → +
- URL eingeben → OK
- VCS → Git → Push
IntelliJ erstellt automatisch .gitignore. Prüfe ob enthalten:
# Gradle
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
# IntelliJ
.idea/
*.iml
*.iws
*.ipr
out/
# OS
.DS_Store
Thumbs.db
# Compiled
*.class1. Test-Klasse erstellen (TDD-Ansatz):
src/test/java/.../lektion2/StackTest.java
2. Test schreiben:
3. Test laufen lassen → Fehlschlag (Klasse existiert nicht)
4. Implementierung erstellen:
src/main/java/.../lektion2/Stack.java
5. Implementieren bis Test grün
6. Commit:
git add .
git commit -m "Implement Stack with push/pop"
git pushIm Terminal oder Gradle Tab:
# Projekt kompilieren
./gradlew build
# Tests ausführen
./gradlew test
# Nur kompilieren (keine Tests)
./gradlew compileJava
# Projekt aufräumen
./gradlew clean
# Alle Tasks anzeigen
./gradlew tasks
# Build ohne Tests
./gradlew build -x testCode Navigation:
Ctrl + N: Klasse suchenCtrl + Shift + N: Datei suchenCtrl + B: Zur Definition springenAlt + F7: Verwendungen finden
Code Generation:
Alt + Insert: Generate (Constructor, Getter, etc.)Ctrl + O: Methoden überschreibenCtrl + Space: Code Completion
Refactoring:
Shift + F6: RenameCtrl + Alt + M: Extract MethodCtrl + Alt + V: Extract Variable
Tests:
Ctrl + Shift + F10: Test unter Cursor ausführenShift + F10: Letzten Test wiederholen
de.fernuni.datenstrukturen/
├── lektion2/
│ ├── list/
│ │ ├── LinkedList.java
│ │ ├── DoublyLinkedList.java
│ │ └── ArrayList.java
│ ├── stack/
│ │ └── Stack.java
│ ├── queue/
│ │ └── Queue.java
│ ├── tree/
│ │ ├── BinaryTree.java
│ │ └── Node.java
│ └── mapping/
│ └── Mapping.java
└── util/
└── TestHelper.java
Lösung:
- File → Invalidate Caches → Invalidate and Restart
- Gradle Version in
gradle-wrapper.propertiesprüfen - Internet-Verbindung prüfen
Lösung:
- Gradle Sync durchführen: File → Sync Project with Gradle Files
- Dependencies in
build.gradleprüfen - JUnit 5 korrekt konfiguriert?
Lösung:
test { useJUnitPlatform() }inbuild.gradlevorhanden?- JUnit 5 Annotations verwendet (
@Test, nicht@org.junit.Test)? - Test-Klasse im richtigen Verzeichnis (
src/test/java)?
Lösung:
- File → Project Structure → Project
- SDK: Korrektes JDK auswählen
- Language Level: Entsprechend setzen
✓ de.fernuni.datenstrukturen.lektion2.stack
✗ stack
✗ Stack
✓ LinkedList.java (Klasse = LinkedList)
✗ linkedList.java
✗ linked_list.java
✓ LinkedListTest.java
✓ testInsertAtPosition()
✓ shouldReturnTrueWhenListIsEmpty()
✗ Test1.java
✗ test1()
✓ "Implement doubly linked list insert operation"
✓ "Fix queue dequeue bug when empty"
✓ "Add tests for stack overflow handling"
✗ "update"
✗ "fix"
✗ "asdf"
In build.gradle ergänzen:
dependencies {
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
// Optional: Bessere Assertions
testImplementation 'org.assertj:assertj-core:3.24.2'
}AssertJ Beispiel:
// Standard JUnit
// assertEquals(expected, actual);
// AssertJ (flüssiger, bessere Fehlermeldungen)
// assertThat(actual).isEqualTo(expected);
// assertThat(list).hasSize(3).contains("a", "b", "c");Plugin in build.gradle:
plugins {
id 'java'
id 'jacoco' // Coverage Plugin
}
jacoco {
toolVersion = "0.8.10"
}
test {
useJUnitPlatform()
finalizedBy jacocoTestReport
}
jacocoTestReport {
dependsOn test
reports {
html.required = true
xml.required = false
csv.required = false
}
}Coverage anzeigen:
./gradlew test jacocoTestReport
# Report: build/reports/jacoco/test/html/index.htmlSetup-Reihenfolge:
- IntelliJ: New Project → Gradle → Java
- build.gradle konfigurieren
- Package-Struktur erstellen
- Git initialisieren
- GitHub remote hinzufügen
Workflow:
- Test schreiben
- Implementieren
- Test grün machen
- Commit & Push
Gradle Basics:
./gradlew build- Alles bauen./gradlew test- Tests laufen lassen./gradlew clean- Aufräumen
Bei Problemen:
- Gradle Sync
- Cache invalidieren
- Dependencies prüfen