Fit für das Jobinterview und die Praxis – mit mehr als 100 Aufgaben und Musterlösungen
E-Book, Deutsch, 599 Seiten
Reihe: Programmieren mit Java
ISBN: 978-3-96910-029-5
Verlag: dpunkt.verlag
Format: EPUB
Kopierschutz: 6 - ePub Watermark
Ihr Java-Trainingsbuch mit Musterlösungen
Lernen Sie Tipps und Kniffe vom Java-Experten kennen
Erweitern Sie Ihr Java-Knowhow in praxisrelevanten Bereichen
Dieses Buch bietet Ihnen ein breit gefächertes Spektrumvon über 100 Übungsaufgaben und Programmierpuzzlesinklusive Lösungen zum Knobeln und Erweitern Ihrer Kenntnisse zu unterschiedlichen praxisrelevantenThemengebieten wie Arrays, Datenstrukturen, Rekursion,Date and Time API usw. Jedes Themengebiet wird in einem eigenen Kapitel
behandelt, das zunächst mit einer Einführung in die
Grundlagen beginnt. Danach finden sich zumeist10 bis 15 Übungsaufgaben verschiedener
Schwierigkeitsgrade, sodass von Anfänger bis
Fortgeschrittenen immer etwas dabei ist und
sich die Programmierkenntnisse effektiv verbessern
lassen. Dabei helfen am Kapitelabschluss insbesonderedetaillierte Musterlösungen inklusive der genutztenAlgorithmen zu allen Aufgaben. Vielfach werden
zudem alternative Lösungswege aufgezeigt, aber
auch mögliche Fallstricke und typische Fehler
thematisiert. Abgerundet wird das Buch durch zwei Anhänge.Einer gibt einen Überblick in wesentliche Neuerungen
von Java 8. Der zweite beschäftigt sich mit der
JShell, die zum Ausprobieren der Codeschnipselund Beispiele des Buchs oftmals hilfreich ist.
Autoren/Hrsg.
Fachgebiete
Weitere Infos & Material
1Einleitung
Herzlich willkommen zu diesem Übungsbuch! Bevor Sie loslegen, möchte ich kurz darstellen, was Sie bei der Lektüre erwartet. Dieses Buch behandelt verschiedene praxisrelevante Themengebiete und deckt diese durch Übungsaufgaben unterschiedlicher Schwierigkeitsstufen ab. Die Übungsaufgaben sind (größtenteils) voneinander unabhängig und können je nach Lust und Laune oder Interesse in beliebiger Reihenfolge gelöst werden. Neben den Aufgaben finden sich die jeweiligen Lösungen inklusive einer kurzen Beschreibung des zur Lösung verwendeten Algorithmus sowie dem eigentlichen, an wesentlichen Stellen kommentierten Sourcecode. 1.1Aufbau der Kapitel
Jedes Kapitel ist strukturell gleich aufgebaut, sodass Sie sich schnell zurechtfinden werden. Einführung Ein Kapitel beginnt jeweils mit einer Einführung in die jeweilige Thematik, um auch diejenigen Leser abzuholen, die mit dem Themengebiet vielleicht noch nicht so vertraut sind, oder aber, um Sie auf die nachfolgenden Aufgaben entsprechend einzustimmen. Aufgaben Danach schließt sich ein Block mit Übungsaufgaben und folgender Struktur an: AufgabenstellungJede einzelne Übungsaufgabe besitzt zunächst eine Aufgabenstellung. Dort werden in wenigen Sätzen die zu realisierenden Funktionalitäten beschrieben. Oftmals wird auch schon eine mögliche Methodensignatur als Anhaltspunkt zur Lösung angegeben. BeispieleErgänzend finden sich fast immer Beispiele zur Verdeutlichung mit Eingaben und erwarteten Ergebnissen. Nur für einige recht einfache Aufgaben, die vor allem zum Kennenlernen eines APIs dienen, wird mitunter auf Beispiele verzichtet. Oftmals werden in einer Tabelle verschiedene Wertebelegungen von Eingabeparameter(n) sowie das erwartete Ergebnis dargestellt, etwa wie folgt: Eingabe A Eingabe B Ergebnis [1, 2, 4, 7, 8] [2, 3, 7, 9] [2, 7] Für die Angaben gelten folgende Notationsformen: "AB" – steht für textuelle Angaben true / false – repräsentieren boolesche Werte 123 – Zahlenangaben [ value1, value2, …. ] – steht für Collections wie Sets oder Listen, aber auch Arrays { key1 : value1, key2 : value3, … } – beschreibt Maps Lösungen Auch der Teil der Lösungen besitzt die nachfolgend beschriebene Struktur. Aufgabenstellung und BeispieleZunächst finden wir nochmals die Aufgabenstellung, sodass wir nicht ständig zwischen Aufgaben und Lösungen hin- und herblättern müssen, sondern das Ganze in sich abgeschlossen ist. AlgorithmusDanach folgt eine Beschreibung des gewählten Algorithmus zur Lösung. Aus Gründen der Didaktik zeige ich bewusst auch einmal einen Irrweg oder eine nicht so optimale Lösung, um daran dann Fallstricke aufzudecken und iterativ zu einer Verbesserung zu kommen. Tatsächlich ist die eine oder andere Brute-Force-Lösung manchmal sogar schon brauchbar, bietet aber Optimierungspotenziale. Exemplarisch werde ich immer wieder entsprechende, mitunter verblüffend einfache, aber oft auch sehr wirksame Verbesserungen vorstellen. PrüfungTeilweise sind die Aufgaben recht leicht oder dienen nur dem Kennenlernen von Syntax oder API-Funktionalität. Dafür scheint es mir oftmals ausreichend, ein paar Aufrufe direkt in der JShell auszuführen. Deshalb verzichte ich hierfür auf Unit Tests. Gleiches gilt auch, wenn wir bevorzugt eine grafische Aufbereitung einer Lösung, etwa die Darstellung eines Sudoku-Spielfelds zur Kontrolle nutzen und der korrespondierende Unit Test vermutlich schwieriger verständlich wäre. Je komplizierter allerdings die Algorithmen werden, desto mehr lauern auch Fehlerquellen, wie falsche Indexwerte, eine versehentliche oder unterbliebene Negation oder ein übersehener Randfall. Deswegen bietet es sich an, Funktionalitäten mithilfe von Unit Tests zu überprüfen – in diesem Buch kann das aus Platzgründen natürlich nur exemplarisch für wichtige Eingaben geschehen. Insgesamt existieren jedoch über 90 Unit Tests mit rund 750 Testfällen. Ein ziemlich guter Anfang. Trotzdem sollte in der Praxis das Netz an Unit Tests und Testfällen wenn möglich noch umfangreicher sein. 1.2Grundgerüst des Eclipse-Projekts
Auch das mitgelieferte Eclipse-Projekt orientiert sich in seinem Aufbau an demjenigen des Buchs und bietet für die Kapitel mit Übungsaufgaben jeweils ein eigenes Package pro Kapitel, z. B. ch02_math oder ch08_recursion_advanced. Dabei weiche ich ausnahmsweise von der Namenskonvention für Packages ab, weil ich die Unterstriche in diesem Fall für eine lesbare Notation halte. Einige der Sourcecode-Schnipsel aus den jeweiligen Einführungen finden sich in einem Subpackage intro. Die bereitgestellten (Muster-)Lösungen werden in jeweils eigenen Subpackages namens solutions gesammelt und die Klassen sind gemäß Aufgabenstellung wie folgt benannt: Ex
Um den Rahmen des Buchs nicht zu sprengen, zeigen die abgebildeten Unit Tests jeweils nur die Testmethoden, jedoch nicht die Testklasse und die Imports. Damit Sie ein Grundgerüst haben, in das Sie die Testmethoden einfügen können sowie als Ausgangspunkt für eigene Experimente, ist nachfolgend eine typische Testklasse gezeigt: import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.LocalDate; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import org.junit.jupiter.params.provider.MethodSource; public class SomeUnitTests { @ParameterizedTest(name = "value at pos {index} ==> {0} should be perfect") @ValueSource(ints = { 6, 28, 496, 8128 } ) void testIsPerfectNumberSimple(int value) { assertTrue(Ex03_PerfectNumbers.isPerfectNumberSimple(value)); } @ParameterizedTest @CsvSource({"2017-01-01, 2018-01-01, 53", "2019-01-01, 2019-02-07, 5"}) void testAllSundaysBetween(LocalDate start, LocalDate end, int expected) { var result = Ex09_CountSundaysExample.allSundaysBetween(start, end); assertEquals(expected, result.count()); } @ParameterizedTest(name = "calcPrimes({0}) =...