From 0c8383fd67d472f37f574040bfa9bb9f845391a9 Mon Sep 17 00:00:00 2001 From: Thomas Smits Date: Tue, 13 Jan 2026 14:14:02 +0100 Subject: [PATCH] Update of exercises --- Abstrakte_Klassen_001/readme.md | 2 +- Abstrakte_Klassen_002/readme.md | 2 +- Ausnahmen_001/readme.md | 2 +- Ausnahmen_002/readme.md | 2 +- Ausnahmen_003/readme.md | 2 +- Ausnahmen_004/readme.md | 2 +- Ausnahmen_005/readme.md | 2 +- Collections_001/readme.md | 2 +- Collections_002/readme.md | 2 +- Collections_003/readme.md | 2 +- Collections_004/readme.md | 2 +- Collections_005/readme.md | 2 +- Collections_006/readme.md | 2 +- Collections_007/readme.md | 2 +- Collections_008/readme.md | 2 +- Collections_009/readme.md | 2 +- Collections_010/readme.md | 2 +- Collections_011/readme.md | 2 +- Enumerationen_001/readme.md | 2 +- Enumerationen_002/readme.md | 2 +- Enumerationen_003/readme.md | 2 +- Enumerationen_004/readme.md | 2 +- Generische_Typen_001/readme.md | 2 +- Generische_Typen_002/readme.md | 2 +- Generische_Typen_003/readme.md | 2 +- Generische_Typen_004/readme.md | 2 +- Generische_Typen_005/readme.md | 2 +- Generische_Typen_006/readme.md | 2 +- Generische_Typen_007/readme.md | 2 +- Generische_Typen_008/readme.md | 2 +- Generische_Typen_009/readme.md | 2 +- Geschachtelte_Klassen_001/readme.md | 2 +- Geschachtelte_Klassen_002/readme.md | 2 +- Geschachtelte_Klassen_003/readme.md | 2 +- Input_und_Output_001/readme.md | 2 +- Input_und_Output_002/readme.md | 2 +- Input_und_Output_003/readme.md | 2 +- Input_und_Output_004/readme.md | 2 +- Input_und_Output_005/readme.md | 2 +- Input_und_Output_006/readme.md | 2 +- Input_und_Output_007/readme.md | 2 +- Input_und_Output_008/readme.md | 2 +- Input_und_Output_009/readme.md | 2 +- Input_und_Output_010/readme.md | 2 +- Input_und_Output_011/readme.md | 2 +- Input_und_Output_012/readme.md | 2 +- Input_und_Output_013/readme.md | 2 +- Input_und_Output_014/readme.md | 2 +- Input_und_Output_015/readme.md | 2 +- Input_und_Output_016/readme.md | 2 +- Interfaces_001/readme.md | 2 +- Interfaces_002/readme.md | 2 +- Interfaces_003/readme.md | 2 +- Interfaces_004/readme.md | 2 +- Lambdas_001/readme.md | 2 +- Lambdas_002/readme.md | 2 +- Object_und_Wrapper_001/readme.md | 2 +- Object_und_Wrapper_002/readme.md | 2 +- Object_und_Wrapper_003/readme.md | 2 +- Object_und_Wrapper_004/readme.md | 2 +- Object_und_Wrapper_005/readme.md | 2 +- Object_und_Wrapper_006/readme.md | 2 +- Object_und_Wrapper_007/readme.md | 2 +- Reflection_001/readme.md | 2 +- Reflection_001/solution/readme.md | 5 + Reflection_002/readme.md | 2 +- Reflection_002/solution/readme.md | 5 + Streams_001/readme.md | 2 +- Streams_002/readme.md | 2 +- Streams_003/readme.md | 2 +- Streams_004/readme.md | 2 +- Streams_005/readme.md | 2 +- Streams_006/readme.md | 2 +- Streams_007/readme.md | 2 +- Streams_008/readme.md | 2 +- Streams_009/readme.md | 2 +- Streams_010/readme.md | 2 +- Threads_001/readme.md | 2 +- Threads_002/readme.md | 2 +- Threads_003/readme.md | 2 +- Threads_004/readme.md | 2 +- Threads_005/readme.md | 2 +- Threads_006/readme.md | 2 +- Threads_007/readme.md | 2 +- Threads_008/readme.md | 2 +- Vererbung_001/readme.md | 2 +- Vererbung_002/readme.md | 2 +- Vererbung_003/readme.md | 2 +- Vererbung_004/readme.md | 2 +- Vererbung_005/readme.md | 2 +- Vererbung_006/readme.md | 2 +- Vererbung_007/readme.md | 2 +- Vererbung_008/readme.md | 2 +- Vererbung_009/readme.md | 2 +- Vererbung_010/readme.md | 2 +- Vererbung_011/readme.md | 2 +- Vererbung_012/readme.md | 2 +- readme.md | 196 +++++++++--------- .../pr2/collections/iterator/SimpleStack.java | 79 +++++++ .../pr2/collections/list/WordCollector.java | 123 +++++++++++ .../pr2/collections/list_iterator/Liste.java | 57 +++++ .../java/pr2/collections/map/WordCount.java | 83 ++++++++ .../pr2/collections/map/WordFrequency.java | 56 +++++ .../pr2/collections/reverser/Reverser.java | 18 ++ .../reverser_generic/Reverser.java | 19 ++ .../pr2/collections/set/WordCollector.java | 81 ++++++++ .../sorter_1/CommandLineSorter.java | 17 ++ .../sorter_2/CommandLineSorter.java | 16 ++ .../pr2/collections/sortieren/Sorter.java | 83 ++++++++ .../collections/woerterbuch/Woerterbuch.java | 37 ++++ .../main/java/pr2/enums/eigene/Wuerfel.java | 38 ++++ .../java/pr2/enums/eigene/WuerfelTyp.java | 70 +++++++ .../java/pr2/enums/filme/LieblingsFilme.java | 50 +++++ .../src/main/java/pr2/enums/filme/Main.java | 9 + .../src/main/java/pr2/enums/schnick/Move.java | 46 ++++ .../enums/schnick/SchnickSchnackSchnuck.java | 89 ++++++++ .../main/java/pr2/enums/singleton/MyEnum.java | 7 + .../pr2/enums/singleton/SingletonBeweis.java | 14 ++ .../ausnahmen_testen/CrypterCaesar.java | 164 +++++++++++++++ .../ausnahmen_testen/IllegalKeyException.java | 31 +++ .../IllegalMessageException.java | 31 +++ .../pr2/exceptions/eigene_ausnahme/Fuse.java | 58 ++++++ .../eigene_ausnahme/FuseTrippedException.java | 37 ++++ .../IllegalCurrentException.java | 30 +++ .../pr2/exceptions/fakultaet/Fakultaet.java | 18 ++ .../fakultaet/FakultaetException.java | 15 ++ .../handle_or_declare/Buchstabenzaehler.java | 120 +++++++++++ .../handle_or_declare/StatistikException.java | 31 +++ .../pr2/exceptions/try_catch/Zahlenraten.java | 68 ++++++ .../main/java/pr2/generics/einfach/Liste.java | 88 ++++++++ .../java/pr2/generics/einfach/ListeNode.java | 28 +++ .../java/pr2/generics/number_pair/Main.java | 15 ++ .../pr2/generics/number_pair/NumberPair.java | 8 + .../java/pr2/generics/number_pair/Pair.java | 20 ++ .../src/main/java/pr2/generics/pair/Main.java | 17 ++ .../src/main/java/pr2/generics/pair/Pair.java | 20 ++ .../main/java/pr2/generics/pairlist/Main.java | 19 ++ .../main/java/pr2/generics/pairlist/Pair.java | 20 ++ .../java/pr2/generics/pairlist/PairList.java | 20 ++ .../generics/printer/CollectionPrinter.java | 11 + .../main/java/pr2/generics/printer/Main.java | 23 ++ .../main/java/pr2/generics/queue/Queue.java | 39 ++++ .../java/pr2/generics/same_pair/Main.java | 15 ++ .../java/pr2/generics/same_pair/Pair.java | 20 ++ .../java/pr2/generics/same_pair/SamePair.java | 8 + .../pr2/generics/super_extends/Liste.java | 108 ++++++++++ .../pr2/generics/super_extends/ListeNode.java | 28 +++ .../pr2/generics/wildcards/ListHelper.java | 37 ++++ .../java/pr2/generics/wildcards/Main.java | 41 ++++ .../pr2/generics/wildcards/SimpleList.java | 12 ++ .../pr2/interfaces/abstrakt_form/Form.java | 16 ++ .../abstrakte_klassen_s/Dreieck.java | 39 ++++ .../interfaces/abstrakte_klassen_s/Figur.java | 14 ++ .../abstrakte_klassen_s/Geometer.java | 43 ++++ .../interfaces/abstrakte_klassen_s/Kreis.java | 32 +++ .../comparable_student/Student.java | 42 ++++ .../interfaces_s/api/AnalogController.java | 44 ++++ .../interfaces_s/api/DigitalController.java | 36 ++++ .../impl/AnalogControllerImpl.java | 61 ++++++ .../impl/DigitalControllerImpl.java | 55 +++++ .../interfaces_s/impl/DualShock4.java | 95 +++++++++ .../main/java/pr2/interfaces/stack/Stack.java | 12 ++ .../java/pr2/interfaces/stack/StackImpl.java | 43 ++++ .../interfaces/uebersetzer/Translator.java | 37 ++++ .../interfaces/uebersetzer/Uebersetzer.java | 13 ++ .../UebersetzerDeutschEnglisch.java | 16 ++ .../UebersetzerDeutschSpanisch.java | 16 ++ .../io/buffered_reader/LineNumberPrinter.java | 36 ++++ .../main/java/pr2/io/data_output/Board.java | 172 +++++++++++++++ .../main/java/pr2/io/data_output/Color.java | 30 +++ .../pr2/io/datainputoutput_1/DateReader.java | 43 ++++ .../pr2/io/datainputoutput_1/DateWriter.java | 63 ++++++ .../pr2/io/datainputoutput_2/DateReader.java | 45 ++++ .../pr2/io/datainputoutput_2/DateWriter.java | 63 ++++++ .../java/pr2/io/datei_lesen/ReadData.java | 33 +++ .../pr2/io/datei_schreiben/WriteData.java | 29 +++ .../java/pr2/io/file/FilesystemWalker.java | 94 +++++++++ .../main/java/pr2/io/filetest/FileInfo.java | 40 ++++ .../main/java/pr2/io/filter/UCaseReader.java | 36 ++++ .../java/pr2/io/konsole/ConsoleToFile.java | 46 ++++ .../java/pr2/io/linecounter/LineCounter.java | 29 +++ .../java/pr2/io/random_access/FileSort.java | 58 ++++++ .../io/reader_writer/ReadAndPrintFile.java | 34 +++ .../src/main/java/pr2/io/rot13/Rot13.java | 25 +++ .../main/java/pr2/io/rot13/Rot13Reader.java | 24 +++ .../main/java/pr2/io/scrambler/Scrambler.java | 38 ++++ .../java/pr2/io/serialisierung/Board.java | 139 +++++++++++++ .../java/pr2/io/serialisierung/Color.java | 30 +++ .../pr2/lambda/array_sorter/ReverseSort.java | 28 +++ .../main/java/pr2/lambda/callback/Main.java | 46 ++++ .../pr2/lambda/callback/NumberSelector.java | 30 +++ .../java/pr2/lambda/callback/Predicate.java | 20 ++ .../pr2/lambda/comparator/SortLambda.java | 12 ++ .../main/java/pr2/lambda/lambdas/Main.java | 31 +++ .../pr2/lambda/lambdas/NumberSelector.java | 30 +++ .../java/pr2/lambda/lambdas/Predicate.java | 20 ++ .../pr2/lambda/matrixsuche/MatrixSuche.java | 39 ++++ .../lambda/mogrifier_1/StringFunction.java | 6 + .../mogrifier_1/StringTransmogrifier.java | 14 ++ .../lambda/mogrifier_2/StringFunction.java | 18 ++ .../mogrifier_2/StringTransmogrifier.java | 14 ++ .../java/pr2/lambda/observer/Beobachter.java | 5 + .../java/pr2/lambda/observer/Datenhalter.java | 23 ++ .../lambda/observer/DatenhalterAnonym.java | 19 ++ .../java/pr2/object/clone_alien/Alien.java | 100 +++++++++ .../pr2/object/clone_alien/Raumanzug.java | 75 +++++++ .../java/pr2/object/clone_person/Person.java | 34 +++ .../java/pr2/object/equals_hashcode/Ork.java | 57 +++++ .../pr2/object/equals_hashcode/Wesen.java | 66 ++++++ .../java/pr2/object/equals_person/Person.java | 54 +++++ .../main/java/pr2/object/tostring/Alien.java | 56 +++++ .../java/pr2/object/tostring/Ausgabe.java | 24 +++ .../java/pr2/object/tostring/Raumanzug.java | 52 +++++ .../object/wrapper_boxsearch/BoxSearcher.java | 18 ++ .../object/wrapper_umwandler/Umwandler.java | 47 +++++ .../pr2/reflection/analyzer/Analyzer.java | 33 +++ .../pr2/reflection/reflector/Reflector.java | 21 ++ .../pr2/streams/chars_1/CountLetters.java | 13 ++ .../pr2/streams/chars_2/CountLetters.java | 16 ++ .../pr2/streams/chars_3/CountLetters.java | 17 ++ .../java/pr2/streams/filter/FilterList.java | 17 ++ .../interne_iteration/ComputerGame.java | 87 ++++++++ .../interne_iteration/GameDatabase.java | 61 ++++++ .../streams/interne_iteration/ListGames.java | 39 ++++ .../pr2/streams/map_filter/ComputerGame.java | 88 ++++++++ .../pr2/streams/map_filter/GameDatabase.java | 61 ++++++ .../streams/map_filter/MapFilterGames.java | 47 +++++ .../main/java/pr2/streams/reduce/Squarer.java | 25 +++ .../streams/reduce_critics/ComputerGame.java | 88 ++++++++ .../streams/reduce_critics/GameDatabase.java | 61 ++++++ .../reduce_critics/MapReduceGames.java | 41 ++++ .../java/pr2/streams/summieren/SumUp.java | 11 + .../pr2/streams/word_count/WordCount.java | 20 ++ .../threads/fakultaet/FakultaetParallel.java | 51 +++++ .../main/java/pr2/threads/fakultaet/Main.java | 13 ++ .../pr2/threads/interrupt/ThreadsBeenden.java | 26 +++ .../main/java/pr2/threads/notifier/Main.java | 40 ++++ .../java/pr2/threads/notifier/Notifier.java | 34 +++ .../paralleldrucker/ParallelDrucker.java | 25 +++ .../java/pr2/threads/race_condition/Main.java | 41 ++++ .../race_condition/NumberIncrementer.java | 42 ++++ .../threads/race_condition/NumberList.java | 60 ++++++ .../pr2/threads/stack_heap/ThreadProblem.java | 32 +++ .../pr2/threads/synchronize/Synchronizer.java | 24 +++ .../pr2/threads/timer/FakultaetTimer.java | 39 ++++ .../src/main/java/pr2/threads/timer/Main.java | 14 ++ .../src/main/java/pr2/vererbung/finals/A.java | 32 +++ .../src/main/java/pr2/vererbung/finals/B.java | 22 ++ .../java/pr2/vererbung/geometrie1/Figur.java | 14 ++ .../java/pr2/vererbung/geometrie1/Main.java | 12 ++ .../pr2/vererbung/geometrie1/Rechteck.java | 8 + .../java/pr2/vererbung/geometrie2/Figur.java | 6 + .../java/pr2/vererbung/geometrie2/Main.java | 12 ++ .../pr2/vererbung/geometrie2/Rechteck.java | 8 + .../pr2/vererbung/geometrie3/Dreieck.java | 8 + .../java/pr2/vererbung/geometrie3/Figur.java | 19 ++ .../java/pr2/vererbung/geometrie3/Gerade.java | 17 ++ .../java/pr2/vererbung/geometrie3/Main.java | 12 ++ .../pr2/vererbung/geometrie3/Quadrat.java | 8 + .../pr2/vererbung/geometrie3/Rechteck.java | 8 + .../pr2/vererbung/konstruktoren/Nachtelf.java | 47 +++++ .../pr2/vererbung/konstruktoren/Untoter.java | 47 +++++ .../pr2/vererbung/konstruktoren/Wesen.java | 30 +++ .../java/pr2/vererbung/polymorphie/Affe.java | 16 ++ .../vererbung/polymorphie/Futterstelle.java | 17 ++ .../pr2/vererbung/polymorphie/Giraffe.java | 16 ++ .../pr2/vererbung/polymorphie/Gorilla.java | 16 ++ .../vererbung/polymorphie/ZooSimulation.java | 40 ++++ .../pr2/vererbung/polymorphie/ZooTier.java | 41 ++++ .../singleton_einfach/Singleton.java | 12 ++ .../java/pr2/vererbung/statics/Spiel.java | 35 ++++ .../java/pr2/vererbung/statics/Wuerfel.java | 53 +++++ .../vererbung/ueberladen_summe/Summator.java | 20 ++ .../ueberschreiben_lebewesen/Amoebe.java | 9 + .../ueberschreiben_lebewesen/Dackel.java | 13 ++ .../ueberschreiben_lebewesen/Lebewesen.java | 8 + .../ueberschreiben_lebewesen/Main.java | 16 ++ .../pr2/vererbung/vararg_summe/Summator.java | 22 ++ .../vererbung_geometrie/Dreieck.java | 17 ++ .../vererbung/vererbung_geometrie/Figur.java | 37 ++++ .../vererbung/vererbung_geometrie/Gerade.java | 31 +++ .../vererbung_geometrie/Quadrat.java | 16 ++ .../vererbung_geometrie/Rechteck.java | 17 ++ .../iterator/test/SimpleStackTest.java | 86 ++++++++ .../reverser/test/ReverserTest.java | 23 ++ .../reverser_generic/test/ReverserTest.java | 23 ++ .../sortieren/test/SorterTest.java | 75 +++++++ .../pr2/enums/eigene/test/WuerfelTest.java | 41 ++++ .../ausnahmen_testen/test/CaesarTest.java | 149 +++++++++++++ .../eigene_ausnahme/test/FuseTest.java | 158 ++++++++++++++ .../fakultaet/test/FakultaetTest.java | 38 ++++ .../pr2/generics/einfach/test/ListeTest.java | 61 ++++++ .../super_extends/test/ListeTest.java | 42 ++++ .../ComparableStudentTest.java | 25 +++ .../test/AnalogControllerTest.java | 52 +++++ .../test/DigitalControllerTest.java | 62 ++++++ .../interfaces_s/test/DualShock4Test.java | 45 ++++ .../java/pr2/interfaces/stack/StackTest.java | 40 ++++ .../pr2/interfaces/stack/test/StackTest.java | 35 ++++ .../pr2/io/data_output/test/BoardTest.java | 64 ++++++ .../datei_schreiben/test/WriteDataTest.java | 39 ++++ .../pr2/io/filter/test/UCaseReaderTest.java | 34 +++ .../io/random_access/test/FileSortTest.java | 62 ++++++ .../pr2/io/serialisierung/test/BoardTest.java | 42 ++++ .../matrixsuche/test/MatrixSucheTest.java | 32 +++ .../test/StringTransmogrifierTest.java | 33 +++ .../test/StringTransmogrifierTest.java | 43 ++++ .../lambda/observer/test/BeobachterTest.java | 17 ++ .../clone_alien/test/AlienCloneTest.java | 37 ++++ .../equals_hashcode/test/WesenTest.java | 87 ++++++++ .../chars_1/test/CountLettersTest.java | 16 ++ .../chars_2/test/CountLettersTest.java | 19 ++ .../chars_3/test/CountLettersTest.java | 19 ++ .../streams/filter/test/FilterListTest.java | 25 +++ .../pr2/streams/reduce/test/SquarerTest.java | 26 +++ .../pr2/streams/summieren/test/SumUpTest.java | 18 ++ .../word_count/test/WordCountTest.java | 21 ++ .../konstruktoren/test/WesenTest.java | 47 +++++ .../ueberladen_summe/SummatorTest.java | 26 +++ .../ueberladen_summe/test/SummatorTest.java | 22 ++ .../vererbung/vararg_summe/SummatorTest.java | 23 ++ .../vararg_summe/test/SummatorTest.java | 23 ++ .../vererbung_geometrie/FigurenTest.java | 67 ++++++ .../vererbung_geometrie/test/FigurenTest.java | 67 ++++++ .../main/java/pr2/io/data_output/Board.java | 2 +- 325 files changed, 8868 insertions(+), 194 deletions(-) create mode 100644 Reflection_001/solution/readme.md create mode 100644 Reflection_002/solution/readme.md create mode 100644 solutions/src/main/java/pr2/collections/iterator/SimpleStack.java create mode 100644 solutions/src/main/java/pr2/collections/list/WordCollector.java create mode 100644 solutions/src/main/java/pr2/collections/list_iterator/Liste.java create mode 100644 solutions/src/main/java/pr2/collections/map/WordCount.java create mode 100644 solutions/src/main/java/pr2/collections/map/WordFrequency.java create mode 100644 solutions/src/main/java/pr2/collections/reverser/Reverser.java create mode 100644 solutions/src/main/java/pr2/collections/reverser_generic/Reverser.java create mode 100644 solutions/src/main/java/pr2/collections/set/WordCollector.java create mode 100644 solutions/src/main/java/pr2/collections/sorter_1/CommandLineSorter.java create mode 100644 solutions/src/main/java/pr2/collections/sorter_2/CommandLineSorter.java create mode 100644 solutions/src/main/java/pr2/collections/sortieren/Sorter.java create mode 100644 solutions/src/main/java/pr2/collections/woerterbuch/Woerterbuch.java create mode 100644 solutions/src/main/java/pr2/enums/eigene/Wuerfel.java create mode 100644 solutions/src/main/java/pr2/enums/eigene/WuerfelTyp.java create mode 100644 solutions/src/main/java/pr2/enums/filme/LieblingsFilme.java create mode 100644 solutions/src/main/java/pr2/enums/filme/Main.java create mode 100644 solutions/src/main/java/pr2/enums/schnick/Move.java create mode 100644 solutions/src/main/java/pr2/enums/schnick/SchnickSchnackSchnuck.java create mode 100644 solutions/src/main/java/pr2/enums/singleton/MyEnum.java create mode 100644 solutions/src/main/java/pr2/enums/singleton/SingletonBeweis.java create mode 100644 solutions/src/main/java/pr2/exceptions/ausnahmen_testen/CrypterCaesar.java create mode 100644 solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalKeyException.java create mode 100644 solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalMessageException.java create mode 100644 solutions/src/main/java/pr2/exceptions/eigene_ausnahme/Fuse.java create mode 100644 solutions/src/main/java/pr2/exceptions/eigene_ausnahme/FuseTrippedException.java create mode 100644 solutions/src/main/java/pr2/exceptions/eigene_ausnahme/IllegalCurrentException.java create mode 100644 solutions/src/main/java/pr2/exceptions/fakultaet/Fakultaet.java create mode 100644 solutions/src/main/java/pr2/exceptions/fakultaet/FakultaetException.java create mode 100644 solutions/src/main/java/pr2/exceptions/handle_or_declare/Buchstabenzaehler.java create mode 100644 solutions/src/main/java/pr2/exceptions/handle_or_declare/StatistikException.java create mode 100644 solutions/src/main/java/pr2/exceptions/try_catch/Zahlenraten.java create mode 100644 solutions/src/main/java/pr2/generics/einfach/Liste.java create mode 100644 solutions/src/main/java/pr2/generics/einfach/ListeNode.java create mode 100644 solutions/src/main/java/pr2/generics/number_pair/Main.java create mode 100644 solutions/src/main/java/pr2/generics/number_pair/NumberPair.java create mode 100644 solutions/src/main/java/pr2/generics/number_pair/Pair.java create mode 100644 solutions/src/main/java/pr2/generics/pair/Main.java create mode 100644 solutions/src/main/java/pr2/generics/pair/Pair.java create mode 100644 solutions/src/main/java/pr2/generics/pairlist/Main.java create mode 100644 solutions/src/main/java/pr2/generics/pairlist/Pair.java create mode 100644 solutions/src/main/java/pr2/generics/pairlist/PairList.java create mode 100644 solutions/src/main/java/pr2/generics/printer/CollectionPrinter.java create mode 100644 solutions/src/main/java/pr2/generics/printer/Main.java create mode 100644 solutions/src/main/java/pr2/generics/queue/Queue.java create mode 100644 solutions/src/main/java/pr2/generics/same_pair/Main.java create mode 100644 solutions/src/main/java/pr2/generics/same_pair/Pair.java create mode 100644 solutions/src/main/java/pr2/generics/same_pair/SamePair.java create mode 100644 solutions/src/main/java/pr2/generics/super_extends/Liste.java create mode 100644 solutions/src/main/java/pr2/generics/super_extends/ListeNode.java create mode 100644 solutions/src/main/java/pr2/generics/wildcards/ListHelper.java create mode 100644 solutions/src/main/java/pr2/generics/wildcards/Main.java create mode 100644 solutions/src/main/java/pr2/generics/wildcards/SimpleList.java create mode 100644 solutions/src/main/java/pr2/interfaces/abstrakt_form/Form.java create mode 100644 solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Dreieck.java create mode 100644 solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Figur.java create mode 100644 solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Geometer.java create mode 100644 solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Kreis.java create mode 100644 solutions/src/main/java/pr2/interfaces/comparable_student/Student.java create mode 100644 solutions/src/main/java/pr2/interfaces/interfaces_s/api/AnalogController.java create mode 100644 solutions/src/main/java/pr2/interfaces/interfaces_s/api/DigitalController.java create mode 100644 solutions/src/main/java/pr2/interfaces/interfaces_s/impl/AnalogControllerImpl.java create mode 100644 solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DigitalControllerImpl.java create mode 100644 solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DualShock4.java create mode 100644 solutions/src/main/java/pr2/interfaces/stack/Stack.java create mode 100644 solutions/src/main/java/pr2/interfaces/stack/StackImpl.java create mode 100644 solutions/src/main/java/pr2/interfaces/uebersetzer/Translator.java create mode 100644 solutions/src/main/java/pr2/interfaces/uebersetzer/Uebersetzer.java create mode 100644 solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschEnglisch.java create mode 100644 solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschSpanisch.java create mode 100644 solutions/src/main/java/pr2/io/buffered_reader/LineNumberPrinter.java create mode 100644 solutions/src/main/java/pr2/io/data_output/Board.java create mode 100644 solutions/src/main/java/pr2/io/data_output/Color.java create mode 100644 solutions/src/main/java/pr2/io/datainputoutput_1/DateReader.java create mode 100644 solutions/src/main/java/pr2/io/datainputoutput_1/DateWriter.java create mode 100644 solutions/src/main/java/pr2/io/datainputoutput_2/DateReader.java create mode 100644 solutions/src/main/java/pr2/io/datainputoutput_2/DateWriter.java create mode 100644 solutions/src/main/java/pr2/io/datei_lesen/ReadData.java create mode 100644 solutions/src/main/java/pr2/io/datei_schreiben/WriteData.java create mode 100644 solutions/src/main/java/pr2/io/file/FilesystemWalker.java create mode 100644 solutions/src/main/java/pr2/io/filetest/FileInfo.java create mode 100644 solutions/src/main/java/pr2/io/filter/UCaseReader.java create mode 100644 solutions/src/main/java/pr2/io/konsole/ConsoleToFile.java create mode 100644 solutions/src/main/java/pr2/io/linecounter/LineCounter.java create mode 100644 solutions/src/main/java/pr2/io/random_access/FileSort.java create mode 100644 solutions/src/main/java/pr2/io/reader_writer/ReadAndPrintFile.java create mode 100644 solutions/src/main/java/pr2/io/rot13/Rot13.java create mode 100644 solutions/src/main/java/pr2/io/rot13/Rot13Reader.java create mode 100644 solutions/src/main/java/pr2/io/scrambler/Scrambler.java create mode 100644 solutions/src/main/java/pr2/io/serialisierung/Board.java create mode 100644 solutions/src/main/java/pr2/io/serialisierung/Color.java create mode 100644 solutions/src/main/java/pr2/lambda/array_sorter/ReverseSort.java create mode 100644 solutions/src/main/java/pr2/lambda/callback/Main.java create mode 100644 solutions/src/main/java/pr2/lambda/callback/NumberSelector.java create mode 100644 solutions/src/main/java/pr2/lambda/callback/Predicate.java create mode 100644 solutions/src/main/java/pr2/lambda/comparator/SortLambda.java create mode 100644 solutions/src/main/java/pr2/lambda/lambdas/Main.java create mode 100644 solutions/src/main/java/pr2/lambda/lambdas/NumberSelector.java create mode 100644 solutions/src/main/java/pr2/lambda/lambdas/Predicate.java create mode 100644 solutions/src/main/java/pr2/lambda/matrixsuche/MatrixSuche.java create mode 100644 solutions/src/main/java/pr2/lambda/mogrifier_1/StringFunction.java create mode 100644 solutions/src/main/java/pr2/lambda/mogrifier_1/StringTransmogrifier.java create mode 100644 solutions/src/main/java/pr2/lambda/mogrifier_2/StringFunction.java create mode 100644 solutions/src/main/java/pr2/lambda/mogrifier_2/StringTransmogrifier.java create mode 100644 solutions/src/main/java/pr2/lambda/observer/Beobachter.java create mode 100644 solutions/src/main/java/pr2/lambda/observer/Datenhalter.java create mode 100644 solutions/src/main/java/pr2/lambda/observer/DatenhalterAnonym.java create mode 100644 solutions/src/main/java/pr2/object/clone_alien/Alien.java create mode 100644 solutions/src/main/java/pr2/object/clone_alien/Raumanzug.java create mode 100644 solutions/src/main/java/pr2/object/clone_person/Person.java create mode 100644 solutions/src/main/java/pr2/object/equals_hashcode/Ork.java create mode 100644 solutions/src/main/java/pr2/object/equals_hashcode/Wesen.java create mode 100644 solutions/src/main/java/pr2/object/equals_person/Person.java create mode 100644 solutions/src/main/java/pr2/object/tostring/Alien.java create mode 100644 solutions/src/main/java/pr2/object/tostring/Ausgabe.java create mode 100644 solutions/src/main/java/pr2/object/tostring/Raumanzug.java create mode 100644 solutions/src/main/java/pr2/object/wrapper_boxsearch/BoxSearcher.java create mode 100644 solutions/src/main/java/pr2/object/wrapper_umwandler/Umwandler.java create mode 100644 solutions/src/main/java/pr2/reflection/analyzer/Analyzer.java create mode 100644 solutions/src/main/java/pr2/reflection/reflector/Reflector.java create mode 100644 solutions/src/main/java/pr2/streams/chars_1/CountLetters.java create mode 100644 solutions/src/main/java/pr2/streams/chars_2/CountLetters.java create mode 100644 solutions/src/main/java/pr2/streams/chars_3/CountLetters.java create mode 100644 solutions/src/main/java/pr2/streams/filter/FilterList.java create mode 100644 solutions/src/main/java/pr2/streams/interne_iteration/ComputerGame.java create mode 100644 solutions/src/main/java/pr2/streams/interne_iteration/GameDatabase.java create mode 100644 solutions/src/main/java/pr2/streams/interne_iteration/ListGames.java create mode 100644 solutions/src/main/java/pr2/streams/map_filter/ComputerGame.java create mode 100644 solutions/src/main/java/pr2/streams/map_filter/GameDatabase.java create mode 100644 solutions/src/main/java/pr2/streams/map_filter/MapFilterGames.java create mode 100644 solutions/src/main/java/pr2/streams/reduce/Squarer.java create mode 100644 solutions/src/main/java/pr2/streams/reduce_critics/ComputerGame.java create mode 100644 solutions/src/main/java/pr2/streams/reduce_critics/GameDatabase.java create mode 100644 solutions/src/main/java/pr2/streams/reduce_critics/MapReduceGames.java create mode 100644 solutions/src/main/java/pr2/streams/summieren/SumUp.java create mode 100644 solutions/src/main/java/pr2/streams/word_count/WordCount.java create mode 100644 solutions/src/main/java/pr2/threads/fakultaet/FakultaetParallel.java create mode 100644 solutions/src/main/java/pr2/threads/fakultaet/Main.java create mode 100644 solutions/src/main/java/pr2/threads/interrupt/ThreadsBeenden.java create mode 100644 solutions/src/main/java/pr2/threads/notifier/Main.java create mode 100644 solutions/src/main/java/pr2/threads/notifier/Notifier.java create mode 100644 solutions/src/main/java/pr2/threads/paralleldrucker/ParallelDrucker.java create mode 100644 solutions/src/main/java/pr2/threads/race_condition/Main.java create mode 100644 solutions/src/main/java/pr2/threads/race_condition/NumberIncrementer.java create mode 100644 solutions/src/main/java/pr2/threads/race_condition/NumberList.java create mode 100644 solutions/src/main/java/pr2/threads/stack_heap/ThreadProblem.java create mode 100644 solutions/src/main/java/pr2/threads/synchronize/Synchronizer.java create mode 100644 solutions/src/main/java/pr2/threads/timer/FakultaetTimer.java create mode 100644 solutions/src/main/java/pr2/threads/timer/Main.java create mode 100644 solutions/src/main/java/pr2/vererbung/finals/A.java create mode 100644 solutions/src/main/java/pr2/vererbung/finals/B.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie1/Figur.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie1/Main.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie1/Rechteck.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie2/Figur.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie2/Main.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie2/Rechteck.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie3/Dreieck.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie3/Figur.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie3/Gerade.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie3/Main.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie3/Quadrat.java create mode 100644 solutions/src/main/java/pr2/vererbung/geometrie3/Rechteck.java create mode 100644 solutions/src/main/java/pr2/vererbung/konstruktoren/Nachtelf.java create mode 100644 solutions/src/main/java/pr2/vererbung/konstruktoren/Untoter.java create mode 100644 solutions/src/main/java/pr2/vererbung/konstruktoren/Wesen.java create mode 100644 solutions/src/main/java/pr2/vererbung/polymorphie/Affe.java create mode 100644 solutions/src/main/java/pr2/vererbung/polymorphie/Futterstelle.java create mode 100644 solutions/src/main/java/pr2/vererbung/polymorphie/Giraffe.java create mode 100644 solutions/src/main/java/pr2/vererbung/polymorphie/Gorilla.java create mode 100644 solutions/src/main/java/pr2/vererbung/polymorphie/ZooSimulation.java create mode 100644 solutions/src/main/java/pr2/vererbung/polymorphie/ZooTier.java create mode 100644 solutions/src/main/java/pr2/vererbung/singleton_einfach/Singleton.java create mode 100644 solutions/src/main/java/pr2/vererbung/statics/Spiel.java create mode 100644 solutions/src/main/java/pr2/vererbung/statics/Wuerfel.java create mode 100644 solutions/src/main/java/pr2/vererbung/ueberladen_summe/Summator.java create mode 100644 solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Amoebe.java create mode 100644 solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Dackel.java create mode 100644 solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Lebewesen.java create mode 100644 solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Main.java create mode 100644 solutions/src/main/java/pr2/vererbung/vararg_summe/Summator.java create mode 100644 solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Dreieck.java create mode 100644 solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Figur.java create mode 100644 solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Gerade.java create mode 100644 solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Quadrat.java create mode 100644 solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Rechteck.java create mode 100644 solutions/src/test/java/pr2/collections/iterator/test/SimpleStackTest.java create mode 100644 solutions/src/test/java/pr2/collections/reverser/test/ReverserTest.java create mode 100644 solutions/src/test/java/pr2/collections/reverser_generic/test/ReverserTest.java create mode 100644 solutions/src/test/java/pr2/collections/sortieren/test/SorterTest.java create mode 100644 solutions/src/test/java/pr2/enums/eigene/test/WuerfelTest.java create mode 100644 solutions/src/test/java/pr2/exceptions/ausnahmen_testen/test/CaesarTest.java create mode 100644 solutions/src/test/java/pr2/exceptions/eigene_ausnahme/test/FuseTest.java create mode 100644 solutions/src/test/java/pr2/exceptions/fakultaet/test/FakultaetTest.java create mode 100644 solutions/src/test/java/pr2/generics/einfach/test/ListeTest.java create mode 100644 solutions/src/test/java/pr2/generics/super_extends/test/ListeTest.java create mode 100644 solutions/src/test/java/pr2/interfaces/comparable_student/ComparableStudentTest.java create mode 100644 solutions/src/test/java/pr2/interfaces/interfaces_s/test/AnalogControllerTest.java create mode 100644 solutions/src/test/java/pr2/interfaces/interfaces_s/test/DigitalControllerTest.java create mode 100644 solutions/src/test/java/pr2/interfaces/interfaces_s/test/DualShock4Test.java create mode 100644 solutions/src/test/java/pr2/interfaces/stack/StackTest.java create mode 100644 solutions/src/test/java/pr2/interfaces/stack/test/StackTest.java create mode 100644 solutions/src/test/java/pr2/io/data_output/test/BoardTest.java create mode 100644 solutions/src/test/java/pr2/io/datei_schreiben/test/WriteDataTest.java create mode 100644 solutions/src/test/java/pr2/io/filter/test/UCaseReaderTest.java create mode 100644 solutions/src/test/java/pr2/io/random_access/test/FileSortTest.java create mode 100644 solutions/src/test/java/pr2/io/serialisierung/test/BoardTest.java create mode 100644 solutions/src/test/java/pr2/lambda/matrixsuche/test/MatrixSucheTest.java create mode 100644 solutions/src/test/java/pr2/lambda/mogrifier_1/test/StringTransmogrifierTest.java create mode 100644 solutions/src/test/java/pr2/lambda/mogrifier_2/test/StringTransmogrifierTest.java create mode 100644 solutions/src/test/java/pr2/lambda/observer/test/BeobachterTest.java create mode 100644 solutions/src/test/java/pr2/object/clone_alien/test/AlienCloneTest.java create mode 100644 solutions/src/test/java/pr2/object/equals_hashcode/test/WesenTest.java create mode 100644 solutions/src/test/java/pr2/streams/chars_1/test/CountLettersTest.java create mode 100644 solutions/src/test/java/pr2/streams/chars_2/test/CountLettersTest.java create mode 100644 solutions/src/test/java/pr2/streams/chars_3/test/CountLettersTest.java create mode 100644 solutions/src/test/java/pr2/streams/filter/test/FilterListTest.java create mode 100644 solutions/src/test/java/pr2/streams/reduce/test/SquarerTest.java create mode 100644 solutions/src/test/java/pr2/streams/summieren/test/SumUpTest.java create mode 100644 solutions/src/test/java/pr2/streams/word_count/test/WordCountTest.java create mode 100644 solutions/src/test/java/pr2/vererbung/konstruktoren/test/WesenTest.java create mode 100644 solutions/src/test/java/pr2/vererbung/ueberladen_summe/SummatorTest.java create mode 100644 solutions/src/test/java/pr2/vererbung/ueberladen_summe/test/SummatorTest.java create mode 100644 solutions/src/test/java/pr2/vererbung/vararg_summe/SummatorTest.java create mode 100644 solutions/src/test/java/pr2/vererbung/vararg_summe/test/SummatorTest.java create mode 100644 solutions/src/test/java/pr2/vererbung/vererbung_geometrie/FigurenTest.java create mode 100644 solutions/src/test/java/pr2/vererbung/vererbung_geometrie/test/FigurenTest.java diff --git a/Abstrakte_Klassen_001/readme.md b/Abstrakte_Klassen_001/readme.md index 5473313..ae04afe 100644 --- a/Abstrakte_Klassen_001/readme.md +++ b/Abstrakte_Klassen_001/readme.md @@ -1,6 +1,6 @@ # Abstrakte Klassen ## Lernziel - + [Musterlösung](solution/) Eine abstrakte Klasse einsetzen, um eine einheitliche Schnittstelle für unterschiedliche Klassen anzubieten. diff --git a/Abstrakte_Klassen_002/readme.md b/Abstrakte_Klassen_002/readme.md index 1e421cf..6f073f6 100644 --- a/Abstrakte_Klassen_002/readme.md +++ b/Abstrakte_Klassen_002/readme.md @@ -1,6 +1,6 @@ # Abstrakte Klasse ## Lernziel - + [Musterlösung](solution/) Abstrakte Klasse verwenden. diff --git a/Ausnahmen_001/readme.md b/Ausnahmen_001/readme.md index 25d3898..2872da7 100644 --- a/Ausnahmen_001/readme.md +++ b/Ausnahmen_001/readme.md @@ -1,6 +1,6 @@ # Ausnahmen testen ## Lernziel - + [Musterlösung](solution/) Bei einer gegebenen Klasse Testfälle mit JUnit schreiben, die auf das Werfen von Ausnahmen testen. diff --git a/Ausnahmen_002/readme.md b/Ausnahmen_002/readme.md index a7299c1..2d6059b 100644 --- a/Ausnahmen_002/readme.md +++ b/Ausnahmen_002/readme.md @@ -1,6 +1,6 @@ # Eigene Ausnahmen schreiben und an entsprechender Stelle werfen ## Lernziel - + [Musterlösung](solution/) Ausnahmen programmieren und sinnvoll einsetzen. Bedeutung der Schlüsselwörter `throws` und `throw` verstehen. diff --git a/Ausnahmen_003/readme.md b/Ausnahmen_003/readme.md index 4713aa3..e51f4aa 100644 --- a/Ausnahmen_003/readme.md +++ b/Ausnahmen_003/readme.md @@ -1,6 +1,6 @@ # Eigene Exception schreiben ## Lernziel - + [Musterlösung](solution/) Eigene Exceptions entwerfen und verwenden. diff --git a/Ausnahmen_004/readme.md b/Ausnahmen_004/readme.md index 514e219..7be7da1 100644 --- a/Ausnahmen_004/readme.md +++ b/Ausnahmen_004/readme.md @@ -1,6 +1,6 @@ # Handle-or-Declare-Regel anwenden ## Lernziel - + [Musterlösung](solution/) In einem vorhandenen Programm die Ausnahmen korrekt weiter deklarieren und an den richtigen Stellen fangen. diff --git a/Ausnahmen_005/readme.md b/Ausnahmen_005/readme.md index 0541024..fd0b99c 100644 --- a/Ausnahmen_005/readme.md +++ b/Ausnahmen_005/readme.md @@ -1,6 +1,6 @@ # Ausnahmen mit `try` und `catch` behandeln. ## Lernziel - + [Musterlösung](solution/) Vorhandene Ausnahmen mit `try` und `catch` abfangen und behandeln. diff --git a/Collections_001/readme.md b/Collections_001/readme.md index 75fa977..f36bba3 100644 --- a/Collections_001/readme.md +++ b/Collections_001/readme.md @@ -1,6 +1,6 @@ # Iterator schreiben ## Lernziel - + [Musterlösung](solution/) Für eine gegebene Klasse einen Iterator schreiben. diff --git a/Collections_002/readme.md b/Collections_002/readme.md index 32bc0e1..ac0bb90 100644 --- a/Collections_002/readme.md +++ b/Collections_002/readme.md @@ -1,6 +1,6 @@ # Iterator programmieren ## Lernziel - + [Musterlösung](solution/) Iteratoren verstehen und programmieren. diff --git a/Collections_003/readme.md b/Collections_003/readme.md index e76858f..5e06a22 100644 --- a/Collections_003/readme.md +++ b/Collections_003/readme.md @@ -1,6 +1,6 @@ # `List` und dessen Implementierungen ## Lernziel - + [Musterlösung](solution/) Das Interface `List` und eine passende Implementierung einsetzen. diff --git a/Collections_004/readme.md b/Collections_004/readme.md index 94b9db9..d95968f 100644 --- a/Collections_004/readme.md +++ b/Collections_004/readme.md @@ -1,6 +1,6 @@ # `Map` verwenden ## Lernziel - + [Musterlösung](solution/) Das Interface `Map` und seine Implementierungen verwenden, um Daten effizient zu verarbeiten. diff --git a/Collections_005/readme.md b/Collections_005/readme.md index b32a790..5e7737f 100644 --- a/Collections_005/readme.md +++ b/Collections_005/readme.md @@ -1,6 +1,6 @@ # ReverserGeneric ## Lernziel - + [Musterlösung](solution/) `Comparable` verstehen und nutzen. diff --git a/Collections_006/readme.md b/Collections_006/readme.md index 1e3a537..812e15e 100644 --- a/Collections_006/readme.md +++ b/Collections_006/readme.md @@ -1,6 +1,6 @@ # Strings umgekehrt sortieren: Reverser ## Lernziel - + [Musterlösung](solution/) `Comparable` verstehen und nutzen. diff --git a/Collections_007/readme.md b/Collections_007/readme.md index 8d2d161..414a4ce 100644 --- a/Collections_007/readme.md +++ b/Collections_007/readme.md @@ -1,6 +1,6 @@ # `Set` und dessen Implementierungen ## Lernziel - + [Musterlösung](solution/) Das Interface `Set` und eine passende Implementierung einsetzen. diff --git a/Collections_008/readme.md b/Collections_008/readme.md index f150c63..20cae96 100644 --- a/Collections_008/readme.md +++ b/Collections_008/readme.md @@ -1,6 +1,6 @@ # CommandLineSorter ## Lernziel - + [Musterlösung](solution/) Sortieren von Collections. diff --git a/Collections_009/readme.md b/Collections_009/readme.md index 0d76a7f..13247e8 100644 --- a/Collections_009/readme.md +++ b/Collections_009/readme.md @@ -1,6 +1,6 @@ # CommandLineSorter -- Version 2 ## Lernziel - + [Musterlösung](solution/) Sortieren von Collections. diff --git a/Collections_010/readme.md b/Collections_010/readme.md index 7a8066c..e7fa2f3 100644 --- a/Collections_010/readme.md +++ b/Collections_010/readme.md @@ -1,6 +1,6 @@ # `Comparator` verwenden und Objekte sortieren ## Lernziel - + [Musterlösung](solution/) Verschiedene Sortierreihenfolgen durch die Implementierung von `Comparator` realisieren. diff --git a/Collections_011/readme.md b/Collections_011/readme.md index 7fcba71..0ee0461 100644 --- a/Collections_011/readme.md +++ b/Collections_011/readme.md @@ -1,6 +1,6 @@ # Wörterbuchprogramm ## Lernziel - + [Musterlösung](solution/) Interface `Map` und seine Implementierungen einsetzen. diff --git a/Enumerationen_001/readme.md b/Enumerationen_001/readme.md index 7b036ac..60f3890 100644 --- a/Enumerationen_001/readme.md +++ b/Enumerationen_001/readme.md @@ -1,6 +1,6 @@ # Eigene Enumeration schreiben und verwenden ## Lernziel - + [Musterlösung](solution/) Eine einfache Enumeration (ohne abstrakte Methoden) erstellen und in einem kleinen Programm einsetzen. diff --git a/Enumerationen_002/readme.md b/Enumerationen_002/readme.md index 2d96a2e..a21124c 100644 --- a/Enumerationen_002/readme.md +++ b/Enumerationen_002/readme.md @@ -1,6 +1,6 @@ # Enumeration schreiben ## Lernziel - + [Musterlösung](solution/) Eine einfache Enumeration (ohne abstrakte Methoden) erstellen und in einem kleinen Programm einsetzen. diff --git a/Enumerationen_003/readme.md b/Enumerationen_003/readme.md index f986150..1deb232 100644 --- a/Enumerationen_003/readme.md +++ b/Enumerationen_003/readme.md @@ -1,6 +1,6 @@ # Singleton-Eigenschaft von Enumerationen ## Lernziel - + [Musterlösung](solution/) Die Singleton-Eigenschaft von Enumerationen verstehen. diff --git a/Enumerationen_004/readme.md b/Enumerationen_004/readme.md index d63cac8..c1a5dc3 100644 --- a/Enumerationen_004/readme.md +++ b/Enumerationen_004/readme.md @@ -1,6 +1,6 @@ # Assignment: Stein, Papier, Schere, Echse, Spock ## Lernziel - + [Musterlösung](solution/) Mit Enumerationen arbeiten. diff --git a/Generische_Typen_001/readme.md b/Generische_Typen_001/readme.md index 73d89a5..8fa3cd7 100644 --- a/Generische_Typen_001/readme.md +++ b/Generische_Typen_001/readme.md @@ -1,6 +1,6 @@ # Einen generischen Typ schreiben ## Lernziel - + [Musterlösung](solution/) Einen vorhandenen Typ so umgestalten, dass er als generischer Typ verwendet werden kann. diff --git a/Generische_Typen_002/readme.md b/Generische_Typen_002/readme.md index 79da9ec..fa9ab2d 100644 --- a/Generische_Typen_002/readme.md +++ b/Generische_Typen_002/readme.md @@ -1,6 +1,6 @@ # Generische Klasse Pair schreiben ## Lernziel - + [Musterlösung](solution/) Von einem generischen Typ erben. diff --git a/Generische_Typen_003/readme.md b/Generische_Typen_003/readme.md index 682e5e1..f4edfcd 100644 --- a/Generische_Typen_003/readme.md +++ b/Generische_Typen_003/readme.md @@ -1,6 +1,6 @@ # Generische Klasse Pair erweitern: NumberPair ## Lernziel - + [Musterlösung](solution/) Von einem generischen Typ erben. diff --git a/Generische_Typen_004/readme.md b/Generische_Typen_004/readme.md index 4ae6226..796bca0 100644 --- a/Generische_Typen_004/readme.md +++ b/Generische_Typen_004/readme.md @@ -1,6 +1,6 @@ # Generische Klasse Pair erweitern: SamePair ## Lernziel - + [Musterlösung](solution/) Von einem generischen Typ erben. diff --git a/Generische_Typen_005/readme.md b/Generische_Typen_005/readme.md index 55a9b8f..232d90b 100644 --- a/Generische_Typen_005/readme.md +++ b/Generische_Typen_005/readme.md @@ -1,6 +1,6 @@ # PairList ## Lernziel - + [Musterlösung](solution/) Sammlungen von Objekten eines generischen Typs erstellen. diff --git a/Generische_Typen_006/readme.md b/Generische_Typen_006/readme.md index 4cbb3db..c022b93 100644 --- a/Generische_Typen_006/readme.md +++ b/Generische_Typen_006/readme.md @@ -1,6 +1,6 @@ # Wildcard benutzen ## Lernziel - + [Musterlösung](solution/) Wildcards einsetzen. diff --git a/Generische_Typen_007/readme.md b/Generische_Typen_007/readme.md index d14fccf..674f811 100644 --- a/Generische_Typen_007/readme.md +++ b/Generische_Typen_007/readme.md @@ -1,6 +1,6 @@ # Generische Queue ## Lernziel - + [Musterlösung](solution/) Einen komplexeren generischen Typ entwickeln. diff --git a/Generische_Typen_008/readme.md b/Generische_Typen_008/readme.md index 89d585d..90c6490 100644 --- a/Generische_Typen_008/readme.md +++ b/Generische_Typen_008/readme.md @@ -1,6 +1,6 @@ # `super` und `extends` einsetzen ## Lernziel - + [Musterlösung](solution/) Methoden unter Verwendung von `super` und `extends` gestalten, sodass sie flexibel auch mit Sub- bzw. Supertypen umgehen können. diff --git a/Generische_Typen_009/readme.md b/Generische_Typen_009/readme.md index d936508..ac06be2 100644 --- a/Generische_Typen_009/readme.md +++ b/Generische_Typen_009/readme.md @@ -1,6 +1,6 @@ # Generische Typen zusammen mit Wildcards einsetzen ## Lernziel - + [Musterlösung](solution/) Gebundene und ungebundene Wildcards einsetzen. diff --git a/Geschachtelte_Klassen_001/readme.md b/Geschachtelte_Klassen_001/readme.md index 35d8843..093e549 100644 --- a/Geschachtelte_Klassen_001/readme.md +++ b/Geschachtelte_Klassen_001/readme.md @@ -1,6 +1,6 @@ # MatrixSuche ## Lernziel - + [Musterlösung](solution/) Statische innere Klassen einsetzen. diff --git a/Geschachtelte_Klassen_002/readme.md b/Geschachtelte_Klassen_002/readme.md index e6d59c4..0933f0b 100644 --- a/Geschachtelte_Klassen_002/readme.md +++ b/Geschachtelte_Klassen_002/readme.md @@ -1,6 +1,6 @@ # Innere Klasse Beobachter ## Lernziel - + [Musterlösung](solution/) Zugriff von inneren Klassen auf die umgebende Klasse. diff --git a/Geschachtelte_Klassen_003/readme.md b/Geschachtelte_Klassen_003/readme.md index bef6698..09845c5 100644 --- a/Geschachtelte_Klassen_003/readme.md +++ b/Geschachtelte_Klassen_003/readme.md @@ -1,6 +1,6 @@ # Callback mit anonymer Klasse realisieren ## Lernziel - + [Musterlösung](solution/) Eine gegebene Funktion durch einen Callback parametrieren. Der Callback wird als anonyme innere Klasse realisiert. diff --git a/Input_und_Output_001/readme.md b/Input_und_Output_001/readme.md index b3dfbe0..810635e 100644 --- a/Input_und_Output_001/readme.md +++ b/Input_und_Output_001/readme.md @@ -1,6 +1,6 @@ # `BufferedReader` zum zeilenweisen Lesen einsetzen ## Lernziel - + [Musterlösung](solution/) Daten Zeilenweise mit einem `BufferedReader` verwenden und dabei das Decorator Pattern einsetzen. diff --git a/Input_und_Output_002/readme.md b/Input_und_Output_002/readme.md index bdbab59..e049e0c 100644 --- a/Input_und_Output_002/readme.md +++ b/Input_und_Output_002/readme.md @@ -1,6 +1,6 @@ # DataOutputStream ## Lernziel - + [Musterlösung](solution/) Daten mit einem `DataOutputStreams` manuell serialisieren. diff --git a/Input_und_Output_003/readme.md b/Input_und_Output_003/readme.md index 8f0233e..e8683fc 100644 --- a/Input_und_Output_003/readme.md +++ b/Input_und_Output_003/readme.md @@ -1,6 +1,6 @@ # DataOutputStream durch Serialisierung ersetzen ## Lernziel - + [Musterlösung](solution/) Daten mit einem `ObjectOutputStreams` serialisieren. diff --git a/Input_und_Output_004/readme.md b/Input_und_Output_004/readme.md index 4f919a2..e31bbe5 100644 --- a/Input_und_Output_004/readme.md +++ b/Input_und_Output_004/readme.md @@ -1,6 +1,6 @@ # Daten mit `DataOutputStream` und `DataInputStream` verarbeiten ## Lernziel - + [Musterlösung](solution/) Ein eigenes Format für die Daten einer Klasse definieren und diese Dann in einer Datei speichern und aus dieser wieder laden. diff --git a/Input_und_Output_005/readme.md b/Input_und_Output_005/readme.md index 7656507..8820ca1 100644 --- a/Input_und_Output_005/readme.md +++ b/Input_und_Output_005/readme.md @@ -1,6 +1,6 @@ # Daten mit einem `InputStream` lesen ## Lernziel - + [Musterlösung](solution/) Einen `InputStream` benutzen, um Daten aus einer Datei zu lesen. diff --git a/Input_und_Output_006/readme.md b/Input_und_Output_006/readme.md index 986d7fe..84eec63 100644 --- a/Input_und_Output_006/readme.md +++ b/Input_und_Output_006/readme.md @@ -1,6 +1,6 @@ # Daten mit einem `OutputStream` schreiben ## Lernziel - + [Musterlösung](solution/) Einen `OutputStream` verwenden, um Daten zu schreiben. diff --git a/Input_und_Output_007/readme.md b/Input_und_Output_007/readme.md index ed6c479..d0ec5c0 100644 --- a/Input_und_Output_007/readme.md +++ b/Input_und_Output_007/readme.md @@ -1,6 +1,6 @@ # Filesystem-Abstraktion mit `File` ## Lernziel - + [Musterlösung](solution/) Die Klasse `Path` einsetzen, um plattformunabhängig Operationen auf dem Dateisystem durchzuführen. diff --git a/Input_und_Output_008/readme.md b/Input_und_Output_008/readme.md index f00effd..d3b93cb 100644 --- a/Input_und_Output_008/readme.md +++ b/Input_und_Output_008/readme.md @@ -1,6 +1,6 @@ # Fileattribute lesen ## Lernziel - + [Musterlösung](solution/) Methoden der Klassen `Path` und `Files` nutzen und verstehen. diff --git a/Input_und_Output_009/readme.md b/Input_und_Output_009/readme.md index f16bd04..f19ca0c 100644 --- a/Input_und_Output_009/readme.md +++ b/Input_und_Output_009/readme.md @@ -1,6 +1,6 @@ # `FilterReader` ## Lernziel - + [Musterlösung](solution/) Einen eigenen Filter in Form eines `FilterReaders` programmieren und hiermit in den Datenstrom eingreifen. diff --git a/Input_und_Output_010/readme.md b/Input_und_Output_010/readme.md index 1856bac..94b7736 100644 --- a/Input_und_Output_010/readme.md +++ b/Input_und_Output_010/readme.md @@ -1,6 +1,6 @@ # Konsolen Input/Output ## Lernziel - + [Musterlösung](solution/) Daten von der Konsole lesen und über eine Ausgabeumlenkung in eine Datei umlenken. `PrintStream` und `InputStreamReader` einsetzen. diff --git a/Input_und_Output_011/readme.md b/Input_und_Output_011/readme.md index b7c2b0c..85eba1c 100644 --- a/Input_und_Output_011/readme.md +++ b/Input_und_Output_011/readme.md @@ -1,6 +1,6 @@ # Zeilen einer Textdatei zählen ## Lernziel - + [Musterlösung](solution/) Dateien zeilenweise lesen und verarbeiten. diff --git a/Input_und_Output_012/readme.md b/Input_und_Output_012/readme.md index a02cae2..9e80fbd 100644 --- a/Input_und_Output_012/readme.md +++ b/Input_und_Output_012/readme.md @@ -1,6 +1,6 @@ # `RandomAccessFile` ## Lernziel - + [Musterlösung](solution/) `RandomAccessFile` sowohl zum Lesen, als auch zum Schreiben von Daten einsetzen. Verstehen, dass man sich wahlfrei durch die Datei bewegen kann. diff --git a/Input_und_Output_013/readme.md b/Input_und_Output_013/readme.md index 457c146..90fce18 100644 --- a/Input_und_Output_013/readme.md +++ b/Input_und_Output_013/readme.md @@ -1,6 +1,6 @@ # `Reader` verwenden ## Lernziel - + [Musterlösung](solution/) Textdaten mithilfe von `Reader` verarbeiten. diff --git a/Input_und_Output_014/readme.md b/Input_und_Output_014/readme.md index 4b37ead..5230a21 100644 --- a/Input_und_Output_014/readme.md +++ b/Input_und_Output_014/readme.md @@ -1,6 +1,6 @@ # Rot13-Verschlüsselung ## Lernziel - + [Musterlösung](solution/) Funktionsweise und Einsatz von Filtern. diff --git a/Input_und_Output_015/readme.md b/Input_und_Output_015/readme.md index c21c74a..08d101c 100644 --- a/Input_und_Output_015/readme.md +++ b/Input_und_Output_015/readme.md @@ -1,6 +1,6 @@ # Datei zerhacken ## Lernziel - + [Musterlösung](solution/) Daten byteweise aus einem Stream lesen. diff --git a/Input_und_Output_016/readme.md b/Input_und_Output_016/readme.md index 3c38348..6b0fda0 100644 --- a/Input_und_Output_016/readme.md +++ b/Input_und_Output_016/readme.md @@ -1,6 +1,6 @@ # Serialisierung ## Lernziel - + [Musterlösung](solution/) Serialisierung einsetzen können, um Objekte zu persistieren und wieder zu laden. diff --git a/Interfaces_001/readme.md b/Interfaces_001/readme.md index efb5d6d..8fba410 100644 --- a/Interfaces_001/readme.md +++ b/Interfaces_001/readme.md @@ -1,6 +1,6 @@ # Comparable implementieren ## Lernziel - + [Musterlösung](solution/) Klasse "comparable" machen. diff --git a/Interfaces_002/readme.md b/Interfaces_002/readme.md index 94ceda5..7e55882 100644 --- a/Interfaces_002/readme.md +++ b/Interfaces_002/readme.md @@ -1,6 +1,6 @@ # Interface Stack entwerfen ## Lernziel - + [Musterlösung](solution/) Ein Interface entwerfen und dieses dann implementieren. diff --git a/Interfaces_003/readme.md b/Interfaces_003/readme.md index e05c6b9..a16f211 100644 --- a/Interfaces_003/readme.md +++ b/Interfaces_003/readme.md @@ -1,6 +1,6 @@ # Interface: Uebersetzer ## Lernziel - + [Musterlösung](solution/) Ein Interface implementieren. diff --git a/Interfaces_004/readme.md b/Interfaces_004/readme.md index 1e20447..bf5f3e5 100644 --- a/Interfaces_004/readme.md +++ b/Interfaces_004/readme.md @@ -1,6 +1,6 @@ # Interfaces anwenden und entwerfen ## Lernziel - + [Musterlösung](solution/) Ein vorhandenes Interface implementieren und ein eigenes Interface programmieren. Klassen schreiben, die mehrere Interfaces implementieren. Die Kollision von gleichnamigen Interface-Methoden und deren Konsequenzen verstehen. diff --git a/Lambdas_001/readme.md b/Lambdas_001/readme.md index d9b8fdb..0540132 100644 --- a/Lambdas_001/readme.md +++ b/Lambdas_001/readme.md @@ -1,6 +1,6 @@ # StringTransmogrifier ## Lernziel - + [Musterlösung](solution/) Funktionale Interfaces entwerfen und verwenden. diff --git a/Lambdas_002/readme.md b/Lambdas_002/readme.md index 8a3de32..f1ce368 100644 --- a/Lambdas_002/readme.md +++ b/Lambdas_002/readme.md @@ -1,6 +1,6 @@ # StringTransmogrifier erweitern ## Lernziel - + [Musterlösung](solution/) Funktionale Interfaces entwerfen und verwenden. diff --git a/Object_und_Wrapper_001/readme.md b/Object_und_Wrapper_001/readme.md index de42507..7edc4a6 100644 --- a/Object_und_Wrapper_001/readme.md +++ b/Object_und_Wrapper_001/readme.md @@ -1,6 +1,6 @@ # Deep-Copy mit `clone()` ## Lernziel - + [Musterlösung](solution/) Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen. diff --git a/Object_und_Wrapper_002/readme.md b/Object_und_Wrapper_002/readme.md index d2f43b5..c459299 100644 --- a/Object_und_Wrapper_002/readme.md +++ b/Object_und_Wrapper_002/readme.md @@ -1,6 +1,6 @@ # Clone ## Lernziel - + [Musterlösung](solution/) Den Nutzen der `clone()`-Methode verstehen und diese richtig einsetzen. Eine eigene `clone()`-Methode schreiben und eine tiefe Kopie durchführen. diff --git a/Object_und_Wrapper_003/readme.md b/Object_und_Wrapper_003/readme.md index 337ee9e..abec53a 100644 --- a/Object_und_Wrapper_003/readme.md +++ b/Object_und_Wrapper_003/readme.md @@ -1,6 +1,6 @@ # `equals()` und `hashCode()` implementieren und nutzen ## Lernziel - + [Musterlösung](solution/) Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen. diff --git a/Object_und_Wrapper_004/readme.md b/Object_und_Wrapper_004/readme.md index cebe590..e2702ab 100644 --- a/Object_und_Wrapper_004/readme.md +++ b/Object_und_Wrapper_004/readme.md @@ -1,6 +1,6 @@ # equals und hashCode ## Lernziel - + [Musterlösung](solution/) Die Methoden `equals()` und `hashCode()` der Klasse `Object` korrekt überschreiben und nutzen. diff --git a/Object_und_Wrapper_005/readme.md b/Object_und_Wrapper_005/readme.md index 5b276d3..add7d3c 100644 --- a/Object_und_Wrapper_005/readme.md +++ b/Object_und_Wrapper_005/readme.md @@ -1,6 +1,6 @@ # `toString()`-Methode implementieren ## Lernziel - + [Musterlösung](solution/) Klassen mit einer `toString()`-Methode versehen und diese gegenseitig nutzen. diff --git a/Object_und_Wrapper_006/readme.md b/Object_und_Wrapper_006/readme.md index b82c722..a22d9d0 100644 --- a/Object_und_Wrapper_006/readme.md +++ b/Object_und_Wrapper_006/readme.md @@ -1,6 +1,6 @@ # Optimierung bei Integer ## Lernziel - + [Musterlösung](solution/) Wrapper-Klassen und deren Optimierungen verstehen. diff --git a/Object_und_Wrapper_007/readme.md b/Object_und_Wrapper_007/readme.md index ed49b9f..2f68756 100644 --- a/Object_und_Wrapper_007/readme.md +++ b/Object_und_Wrapper_007/readme.md @@ -1,6 +1,6 @@ # Methoden der Wrapper-Klassen ## Lernziel - + [Musterlösung](solution/) Wrapper-Klassen nutzen, um Zahlen umzuwandeln. diff --git a/Reflection_001/readme.md b/Reflection_001/readme.md index 4010670..af8058b 100644 --- a/Reflection_001/readme.md +++ b/Reflection_001/readme.md @@ -1,6 +1,6 @@ # Klasse per Reflection analysieren ## Lernziel - + [Musterlösung](solution/) Reflection einsetzen, um Klassen zu untersuchen. diff --git a/Reflection_001/solution/readme.md b/Reflection_001/solution/readme.md new file mode 100644 index 0000000..fc46829 --- /dev/null +++ b/Reflection_001/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Klasse per Reflection analysieren + +Musterlösung: + +[pr2.reflection.analyzer](../../solutions/src/main/java/pr2/reflection/analyzer/) diff --git a/Reflection_002/readme.md b/Reflection_002/readme.md index 7834440..eda8e95 100644 --- a/Reflection_002/readme.md +++ b/Reflection_002/readme.md @@ -1,6 +1,6 @@ # Objekte per Reflection erzeugen ## Lernziel - + [Musterlösung](solution/) Objekte per Reflection erzeugen. diff --git a/Reflection_002/solution/readme.md b/Reflection_002/solution/readme.md new file mode 100644 index 0000000..1bbad3d --- /dev/null +++ b/Reflection_002/solution/readme.md @@ -0,0 +1,5 @@ +# Lösung: Objekte per Reflection erzeugen + +Musterlösung: + +[pr2.reflection.reflector](../../solutions/src/main/java/pr2/reflection/reflector/) diff --git a/Streams_001/readme.md b/Streams_001/readme.md index 39b74d5..c95e4ec 100644 --- a/Streams_001/readme.md +++ b/Streams_001/readme.md @@ -1,6 +1,6 @@ # Kleinbuchstaben in einem String zählen ## Lernziel - + [Musterlösung](solution/) Streams verwenden. diff --git a/Streams_002/readme.md b/Streams_002/readme.md index 2b66375..aad8611 100644 --- a/Streams_002/readme.md +++ b/Streams_002/readme.md @@ -1,6 +1,6 @@ # Buchstaben in einer Liste von Strings zählen ## Lernziel - + [Musterlösung](solution/) Streams verwenden. diff --git a/Streams_003/readme.md b/Streams_003/readme.md index 798b2e6..997e31b 100644 --- a/Streams_003/readme.md +++ b/Streams_003/readme.md @@ -1,6 +1,6 @@ # Kleinbuchstaben in einem String zählen ## Lernziel - + [Musterlösung](solution/) Streams verwenden. diff --git a/Streams_004/readme.md b/Streams_004/readme.md index 6d46587..8035807 100644 --- a/Streams_004/readme.md +++ b/Streams_004/readme.md @@ -1,6 +1,6 @@ # Liste filtern ## Lernziel - + [Musterlösung](solution/) Daten in Streams filtern. diff --git a/Streams_005/readme.md b/Streams_005/readme.md index a993ed6..f67896c 100644 --- a/Streams_005/readme.md +++ b/Streams_005/readme.md @@ -1,6 +1,6 @@ # Streams mit interner Iteration ## Lernziel - + [Musterlösung](solution/) Einen Stream mit einer internen Iteration verwenden. Die Iteration sowohl mit einem Lambda, als auch mit einer Methodenreferenz durchführen. diff --git a/Streams_006/readme.md b/Streams_006/readme.md index 96615d4..1192002 100644 --- a/Streams_006/readme.md +++ b/Streams_006/readme.md @@ -1,6 +1,6 @@ # Map und Filter auf Streams ## Lernziel - + [Musterlösung](solution/) Einen Stream durch Map- und Filter-Operationen analysieren und gewünschte Daten extrahieren. diff --git a/Streams_007/readme.md b/Streams_007/readme.md index db68748..5264296 100644 --- a/Streams_007/readme.md +++ b/Streams_007/readme.md @@ -1,6 +1,6 @@ # Map und Reduce auf Streams ## Lernziel - + [Musterlösung](solution/) Die Daten in einem Stream durch Map- und Reduce verdichten. diff --git a/Streams_008/readme.md b/Streams_008/readme.md index 58eda20..c3ce9c4 100644 --- a/Streams_008/readme.md +++ b/Streams_008/readme.md @@ -1,6 +1,6 @@ # Reduce ## Lernziel - + [Musterlösung](solution/) Daten in Streams mit `reduce` aggregieren. diff --git a/Streams_009/readme.md b/Streams_009/readme.md index 21c21d2..c94f3c5 100644 --- a/Streams_009/readme.md +++ b/Streams_009/readme.md @@ -1,6 +1,6 @@ # Summe über reduce bestimmen ## Lernziel - + [Musterlösung](solution/) Daten in Streams mit `reduce` aggregieren. diff --git a/Streams_010/readme.md b/Streams_010/readme.md index 4b1e108..56c1684 100644 --- a/Streams_010/readme.md +++ b/Streams_010/readme.md @@ -1,6 +1,6 @@ # Wörter zählen ## Lernziel - + [Musterlösung](solution/) Daten in Streams mit `reduce` aggregieren. diff --git a/Threads_001/readme.md b/Threads_001/readme.md index 93db948..3e123dd 100644 --- a/Threads_001/readme.md +++ b/Threads_001/readme.md @@ -1,6 +1,6 @@ # Fakultät parallel berechnen ## Lernziel - + [Musterlösung](solution/) Berechnungen parallelisieren. diff --git a/Threads_002/readme.md b/Threads_002/readme.md index c14a6ed..d058ac6 100644 --- a/Threads_002/readme.md +++ b/Threads_002/readme.md @@ -1,6 +1,6 @@ # Thread per interrupt beenden ## Lernziel - + [Musterlösung](solution/) Threads kontrolliert beenden. diff --git a/Threads_003/readme.md b/Threads_003/readme.md index 714bd4b..b295e6e 100644 --- a/Threads_003/readme.md +++ b/Threads_003/readme.md @@ -1,6 +1,6 @@ # wait und notify benutzen ## Lernziel - + [Musterlösung](solution/) Thread-Koordination über Condition-Variablen. diff --git a/Threads_004/readme.md b/Threads_004/readme.md index 4f73019..85470c2 100644 --- a/Threads_004/readme.md +++ b/Threads_004/readme.md @@ -1,6 +1,6 @@ # Parallele Ausgaben erzeugen ## Lernziel - + [Musterlösung](solution/) Erste Schritte mit Threads. diff --git a/Threads_005/readme.md b/Threads_005/readme.md index b0892d6..beee270 100644 --- a/Threads_005/readme.md +++ b/Threads_005/readme.md @@ -1,6 +1,6 @@ # Race-Condition finden und beheben ## Lernziel - + [Musterlösung](solution/) In einem gegebenen Programm Race-Conditions finden und durch den Einsatz von kritischen Abschnitten beheben. diff --git a/Threads_006/readme.md b/Threads_006/readme.md index 47d08ab..bf0eea1 100644 --- a/Threads_006/readme.md +++ b/Threads_006/readme.md @@ -1,6 +1,6 @@ # Stack und Heap unterscheiden ## Lernziel - + [Musterlösung](solution/) Unterschied zwischen Stack und Heap bei parallelen Programmen verstehen. diff --git a/Threads_007/readme.md b/Threads_007/readme.md index a157f4b..648ed02 100644 --- a/Threads_007/readme.md +++ b/Threads_007/readme.md @@ -1,6 +1,6 @@ # synchronized verwenden ## Lernziel - + [Musterlösung](solution/) Schlüsselwort `synchronized` verwenden. diff --git a/Threads_008/readme.md b/Threads_008/readme.md index c600122..cddb6cd 100644 --- a/Threads_008/readme.md +++ b/Threads_008/readme.md @@ -1,6 +1,6 @@ # Timer und TimerTask verwenden ## Lernziel - + [Musterlösung](solution/) Klassen aus `java.util.concurrent` verwenden. diff --git a/Vererbung_001/readme.md b/Vererbung_001/readme.md index 77182a3..71c5480 100644 --- a/Vererbung_001/readme.md +++ b/Vererbung_001/readme.md @@ -1,6 +1,6 @@ # Final anwenden ## Lernziel - + [Musterlösung](solution/) Das Schlüsselwort `final` in seinen verschiedenen Bedeutungen kennenlernen und syntaktisch an die richtigen Stellen schreiben. diff --git a/Vererbung_002/readme.md b/Vererbung_002/readme.md index 9360e77..1c13a17 100644 --- a/Vererbung_002/readme.md +++ b/Vererbung_002/readme.md @@ -1,6 +1,6 @@ # Figur und Rechteck ## Lernziel - + [Musterlösung](solution/) Vererbung sinnvoll einsetzen. diff --git a/Vererbung_003/readme.md b/Vererbung_003/readme.md index 40bd077..84e08a2 100644 --- a/Vererbung_003/readme.md +++ b/Vererbung_003/readme.md @@ -1,6 +1,6 @@ # Figur erweitern ## Lernziel - + [Musterlösung](solution/) Vererbung sinnvoll einsetzen. diff --git a/Vererbung_004/readme.md b/Vererbung_004/readme.md index 5b086a7..c4c4aac 100644 --- a/Vererbung_004/readme.md +++ b/Vererbung_004/readme.md @@ -1,6 +1,6 @@ # Figur noch einmal erweitern ## Lernziel - + [Musterlösung](solution/) Vererbung sinnvoll einsetzen. diff --git a/Vererbung_005/readme.md b/Vererbung_005/readme.md index 8eef5cd..f3cb310 100644 --- a/Vererbung_005/readme.md +++ b/Vererbung_005/readme.md @@ -1,6 +1,6 @@ # Konstruktoren schreiben ## Lernziel - + [Musterlösung](solution/) Für eine vorhandene Klasse Konstruktoren schreiben und Konstruktoren sich gegenseitig und auch Konstruktoren der Superklasse aufrufen lassen. diff --git a/Vererbung_006/readme.md b/Vererbung_006/readme.md index 0683bb7..8653a59 100644 --- a/Vererbung_006/readme.md +++ b/Vererbung_006/readme.md @@ -1,6 +1,6 @@ # Polymorphie einsetzen ## Lernziel - + [Musterlösung](solution/) Durch Polymorphie Subklassen wie Basisklassen behandeln können. diff --git a/Vererbung_007/readme.md b/Vererbung_007/readme.md index 3decb9f..254a802 100644 --- a/Vererbung_007/readme.md +++ b/Vererbung_007/readme.md @@ -1,6 +1,6 @@ # Singleton ## Lernziel - + [Musterlösung](solution/) Das Design-Pattern _Singleton_ einsetzen. diff --git a/Vererbung_008/readme.md b/Vererbung_008/readme.md index 04501a5..ba67d73 100644 --- a/Vererbung_008/readme.md +++ b/Vererbung_008/readme.md @@ -1,6 +1,6 @@ # Statische Methoden und Attribute ## Lernziel - + [Musterlösung](solution/) Eine Klasse mit statischen Attributen und Methoden entwickeln und die Unterschiede zu normalen Methoden und Attributen verstehen. diff --git a/Vererbung_009/readme.md b/Vererbung_009/readme.md index 72cf564..4996548 100644 --- a/Vererbung_009/readme.md +++ b/Vererbung_009/readme.md @@ -1,6 +1,6 @@ # Methode überladen ## Lernziel - + [Musterlösung](solution/) Methoden überladen. diff --git a/Vererbung_010/readme.md b/Vererbung_010/readme.md index 516e8af..9b09bc6 100644 --- a/Vererbung_010/readme.md +++ b/Vererbung_010/readme.md @@ -1,6 +1,6 @@ # Methoden überschreiben ## Lernziel - + [Musterlösung](solution/) Bei Vererbung das Überschreiben von Methoden einsetzen. diff --git a/Vererbung_011/readme.md b/Vererbung_011/readme.md index 6397fc8..9ca3ce4 100644 --- a/Vererbung_011/readme.md +++ b/Vererbung_011/readme.md @@ -1,6 +1,6 @@ # Varag-Methode schreiben ## Lernziel - + [Musterlösung](solution/) Eine Varag-Methode schreiben. diff --git a/Vererbung_012/readme.md b/Vererbung_012/readme.md index b8dc2dc..da8532d 100644 --- a/Vererbung_012/readme.md +++ b/Vererbung_012/readme.md @@ -1,6 +1,6 @@ # Vererbung von Figuren ## Lernziel - + [Musterlösung](solution/) Einfache Klassen schreiben und eine Vererbungshierarchie bilden. diff --git a/readme.md b/readme.md index ed85bd2..d90485f 100644 --- a/readme.md +++ b/readme.md @@ -23,101 +23,101 @@ Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstat | 9. | Einführung | [Klasse mit JUnit testen](Einfuehrung_003/readme.md) | [✅](Einfuehrung_003/solution/) | | 10. | Strukturierung | [Information-Hiding einer Klasse verbessern](Strukturierung_001/readme.md) | [✅](Strukturierung_001/solution/) | | 11. | Strukturierung | [Vorhandene Bibliotheken als JAR einbinden](Strukturierung_002/readme.md) | [✅](Strukturierung_002/solution/) | -| 12. | Vererbung | [Final anwenden](Vererbung_001/readme.md) | | -| 13. | Vererbung | [Figur und Rechteck](Vererbung_002/readme.md) | | -| 14. | Vererbung | [Figur erweitern](Vererbung_003/readme.md) | | -| 15. | Vererbung | [Figur noch einmal erweitern](Vererbung_004/readme.md) | | -| 16. | Vererbung | [Konstruktoren schreiben](Vererbung_005/readme.md) | | -| 17. | Vererbung | [Polymorphie einsetzen](Vererbung_006/readme.md) | | -| 18. | Vererbung | [Singleton](Vererbung_007/readme.md) | | -| 19. | Vererbung | [Statische Methoden und Attribute](Vererbung_008/readme.md) | | -| 20. | Vererbung | [Methode überladen](Vererbung_009/readme.md) | | -| 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | | -| 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | | -| 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | | -| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | | -| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | | -| 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | | -| 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | | -| 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | | -| 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | | -| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | | -| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | | -| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | | -| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | | -| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | | -| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | | -| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | | -| 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | | -| 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | | -| 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | | -| 40. | Enumerationen | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md) | | -| 41. | Ausnahmen | [Ausnahmen testen](Ausnahmen_001/readme.md) | | -| 42. | Ausnahmen | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md) | | -| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | | -| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | | -| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | | -| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | | -| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | | -| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | | -| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | | -| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | | -| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | | -| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | | -| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | | -| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | | -| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | | -| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | | -| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | | -| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | | -| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | | -| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | | -| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | | -| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | | -| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | | -| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | | -| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | | -| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | | -| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | | -| 68. | Generische Typen | [Generische Queue](Generische_Typen_007/readme.md) | | -| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische_Typen_008/readme.md) | | -| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische_Typen_009/readme.md) | | -| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte_Klassen_001/readme.md) | | -| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte_Klassen_002/readme.md) | | -| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen_003/readme.md) | | -| 74. | Lambdas | [Comparator als Lambda](Lambdas_001/readme.md) | | -| 75. | Lambdas | [Callback mit Lambda realisieren](Lambdas_002/readme.md) | | -| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte_Klassen_001/readme.md) | | -| 77. | Lambdas | [StringTransmogrifier](Lambdas_001/readme.md) | | -| 78. | Lambdas | [StringTransmogrifier erweitern](Lambdas_002/readme.md) | | -| 79. | Collections | [Iterator schreiben](Collections_001/readme.md) | | -| 80. | Collections | [Iterator programmieren](Collections_002/readme.md) | | -| 81. | Collections | [`List` und dessen Implementierungen](Collections_003/readme.md) | | -| 82. | Collections | [`Map` verwenden](Collections_004/readme.md) | | -| 83. | Collections | [ReverserGeneric](Collections_005/readme.md) | | -| 84. | Collections | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md) | | -| 85. | Collections | [`Set` und dessen Implementierungen](Collections_007/readme.md) | | -| 86. | Collections | [CommandLineSorter](Collections_008/readme.md) | | -| 87. | Collections | [CommandLineSorter -- Version 2](Collections_009/readme.md) | | -| 88. | Collections | [`Comparator` verwenden und Objekte sortieren](Collections_010/readme.md) | | -| 89. | Collections | [Wörterbuchprogramm](Collections_011/readme.md) | | -| 90. | Streams | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md) | | -| 91. | Streams | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md) | | -| 92. | Streams | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md) | | -| 93. | Streams | [Liste filtern](Streams_004/readme.md) | | -| 94. | Streams | [Streams mit interner Iteration](Streams_005/readme.md) | | -| 95. | Streams | [Map und Filter auf Streams](Streams_006/readme.md) | | -| 96. | Streams | [Map und Reduce auf Streams](Streams_007/readme.md) | | -| 97. | Streams | [Reduce](Streams_008/readme.md) | | -| 98. | Streams | [Summe über reduce bestimmen](Streams_009/readme.md) | | -| 99. | Streams | [Wörter zählen](Streams_010/readme.md) | | -| 100. | Threads | [Fakultät parallel berechnen](Threads_001/readme.md) | | -| 101. | Threads | [Thread per interrupt beenden](Threads_002/readme.md) | | -| 102. | Threads | [wait und notify benutzen](Threads_003/readme.md) | | -| 103. | Threads | [Parallele Ausgaben erzeugen](Threads_004/readme.md) | | -| 104. | Threads | [Race-Condition finden und beheben](Threads_005/readme.md) | | -| 105. | Threads | [Stack und Heap unterscheiden](Threads_006/readme.md) | | -| 106. | Threads | [synchronized verwenden](Threads_007/readme.md) | | -| 107. | Threads | [Timer und TimerTask verwenden](Threads_008/readme.md) | | -| 108. | Reflection | [Klasse per Reflection analysieren](Reflection_001/readme.md) | | -| 109. | Reflection | [Objekte per Reflection erzeugen](Reflection_002/readme.md) | | +| 12. | Vererbung | [Final anwenden](Vererbung_001/readme.md) | [✅](Vererbung_001/solution/) | +| 13. | Vererbung | [Figur und Rechteck](Vererbung_002/readme.md) | [✅](Vererbung_002/solution/) | +| 14. | Vererbung | [Figur erweitern](Vererbung_003/readme.md) | [✅](Vererbung_003/solution/) | +| 15. | Vererbung | [Figur noch einmal erweitern](Vererbung_004/readme.md) | [✅](Vererbung_004/solution/) | +| 16. | Vererbung | [Konstruktoren schreiben](Vererbung_005/readme.md) | [✅](Vererbung_005/solution/) | +| 17. | Vererbung | [Polymorphie einsetzen](Vererbung_006/readme.md) | [✅](Vererbung_006/solution/) | +| 18. | Vererbung | [Singleton](Vererbung_007/readme.md) | [✅](Vererbung_007/solution/) | +| 19. | Vererbung | [Statische Methoden und Attribute](Vererbung_008/readme.md) | [✅](Vererbung_008/solution/) | +| 20. | Vererbung | [Methode überladen](Vererbung_009/readme.md) | [✅](Vererbung_009/solution/) | +| 21. | Vererbung | [Methoden überschreiben](Vererbung_010/readme.md) | [✅](Vererbung_010/solution/) | +| 22. | Vererbung | [Varag-Methode schreiben](Vererbung_011/readme.md) | [✅](Vererbung_011/solution/) | +| 23. | Vererbung | [Vererbung von Figuren](Vererbung_012/readme.md) | [✅](Vererbung_012/solution/) | +| 24. | Abstrakte Klassen | [Abstrakte Klassen](Abstrakte_Klassen_001/readme.md) | [✅](Abstrakte_Klassen_001/solution/) | +| 25. | Abstrakte Klassen | [Abstrakte Klasse](Abstrakte_Klassen_002/readme.md) | [✅](Abstrakte_Klassen_002/solution/) | +| 26. | Interfaces | [Comparable implementieren](Interfaces_001/readme.md) | [✅](Interfaces_001/solution/) | +| 27. | Interfaces | [Interface Stack entwerfen](Interfaces_002/readme.md) | [✅](Interfaces_002/solution/) | +| 28. | Interfaces | [Interface: Uebersetzer](Interfaces_003/readme.md) | [✅](Interfaces_003/solution/) | +| 29. | Interfaces | [Interfaces anwenden und entwerfen](Interfaces_004/readme.md) | [✅](Interfaces_004/solution/) | +| 30. | Object und Wrapper | [Deep-Copy mit `clone()`](Object_und_Wrapper_001/readme.md) | [✅](Object_und_Wrapper_001/solution/) | +| 31. | Object und Wrapper | [Clone](Object_und_Wrapper_002/readme.md) | [✅](Object_und_Wrapper_002/solution/) | +| 32. | Object und Wrapper | [`equals()` und `hashCode()` implementieren und nutzen](Object_und_Wrapper_003/readme.md) | [✅](Object_und_Wrapper_003/solution/) | +| 33. | Object und Wrapper | [equals und hashCode](Object_und_Wrapper_004/readme.md) | [✅](Object_und_Wrapper_004/solution/) | +| 34. | Object und Wrapper | [`toString()`-Methode implementieren](Object_und_Wrapper_005/readme.md) | [✅](Object_und_Wrapper_005/solution/) | +| 35. | Object und Wrapper | [Optimierung bei Integer](Object_und_Wrapper_006/readme.md) | [✅](Object_und_Wrapper_006/solution/) | +| 36. | Object und Wrapper | [Methoden der Wrapper-Klassen](Object_und_Wrapper_007/readme.md) | [✅](Object_und_Wrapper_007/solution/) | +| 37. | Enumerationen | [Eigene Enumeration schreiben und verwenden](Enumerationen_001/readme.md) | [✅](Enumerationen_001/solution/) | +| 38. | Enumerationen | [Enumeration schreiben](Enumerationen_002/readme.md) | [✅](Enumerationen_002/solution/) | +| 39. | Enumerationen | [Singleton-Eigenschaft von Enumerationen](Enumerationen_003/readme.md) | [✅](Enumerationen_003/solution/) | +| 40. | Enumerationen | [Stein, Papier, Schere, Echse, Spock](Enumerationen_004/readme.md) | [✅](Enumerationen_004/solution/) | +| 41. | Ausnahmen | [Ausnahmen testen](Ausnahmen_001/readme.md) | [✅](Ausnahmen_001/solution/) | +| 42. | Ausnahmen | [Eigene Ausnahmen schreiben und an entsprechender Stelle werfen](Ausnahmen_002/readme.md) | [✅](Ausnahmen_002/solution/) | +| 43. | Ausnahmen | [Eigene Exception schreiben](Ausnahmen_003/readme.md) | [✅](Ausnahmen_003/solution/) | +| 44. | Ausnahmen | [Handle-or-Declare-Regel anwenden](Ausnahmen_004/readme.md) | [✅](Ausnahmen_004/solution/) | +| 45. | Ausnahmen | [Ausnahmen mit `try` und `catch` behandeln.](Ausnahmen_005/readme.md) | [✅](Ausnahmen_005/solution/) | +| 46. | Input und Output | [`BufferedReader` zum zeilenweisen Lesen einsetzen](Input_und_Output_001/readme.md) | [✅](Input_und_Output_001/solution/) | +| 47. | Input und Output | [DataOutputStream](Input_und_Output_002/readme.md) | [✅](Input_und_Output_002/solution/) | +| 48. | Input und Output | [DataOutputStream durch Serialisierung ersetzen](Input_und_Output_003/readme.md) | [✅](Input_und_Output_003/solution/) | +| 49. | Input und Output | [Daten mit `DataOutputStream` und `DataInputStream` verarbeiten](Input_und_Output_004/readme.md) | [✅](Input_und_Output_004/solution/) | +| 50. | Input und Output | [Daten mit einem `InputStream` lesen](Input_und_Output_005/readme.md) | [✅](Input_und_Output_005/solution/) | +| 51. | Input und Output | [Daten mit einem `OutputStream` schreiben](Input_und_Output_006/readme.md) | [✅](Input_und_Output_006/solution/) | +| 52. | Input und Output | [Filesystem-Abstraktion mit `File`](Input_und_Output_007/readme.md) | [✅](Input_und_Output_007/solution/) | +| 53. | Input und Output | [Fileattribute lesen](Input_und_Output_008/readme.md) | [✅](Input_und_Output_008/solution/) | +| 54. | Input und Output | [`FilterReader`](Input_und_Output_009/readme.md) | [✅](Input_und_Output_009/solution/) | +| 55. | Input und Output | [Konsolen Input/Output](Input_und_Output_010/readme.md) | [✅](Input_und_Output_010/solution/) | +| 56. | Input und Output | [Zeilen einer Textdatei zählen](Input_und_Output_011/readme.md) | [✅](Input_und_Output_011/solution/) | +| 57. | Input und Output | [`RandomAccessFile`](Input_und_Output_012/readme.md) | [✅](Input_und_Output_012/solution/) | +| 58. | Input und Output | [`Reader` verwenden](Input_und_Output_013/readme.md) | [✅](Input_und_Output_013/solution/) | +| 59. | Input und Output | [Rot13-Verschlüsselung](Input_und_Output_014/readme.md) | [✅](Input_und_Output_014/solution/) | +| 60. | Input und Output | [Datei zerhacken](Input_und_Output_015/readme.md) | [✅](Input_und_Output_015/solution/) | +| 61. | Input und Output | [Serialisierung](Input_und_Output_016/readme.md) | [✅](Input_und_Output_016/solution/) | +| 62. | Generische Typen | [Einen generischen Typ schreiben](Generische_Typen_001/readme.md) | [✅](Generische_Typen_001/solution/) | +| 63. | Generische Typen | [Generische Klasse Pair schreiben](Generische_Typen_002/readme.md) | [✅](Generische_Typen_002/solution/) | +| 64. | Generische Typen | [Generische Klasse Pair erweitern: NumberPair](Generische_Typen_003/readme.md) | [✅](Generische_Typen_003/solution/) | +| 65. | Generische Typen | [Generische Klasse Pair erweitern: SamePair](Generische_Typen_004/readme.md) | [✅](Generische_Typen_004/solution/) | +| 66. | Generische Typen | [PairList](Generische_Typen_005/readme.md) | [✅](Generische_Typen_005/solution/) | +| 67. | Generische Typen | [Wildcard benutzen](Generische_Typen_006/readme.md) | [✅](Generische_Typen_006/solution/) | +| 68. | Generische Typen | [Generische Queue](Generische_Typen_007/readme.md) | [✅](Generische_Typen_007/solution/) | +| 69. | Generische Typen | [`super` und `extends` einsetzen](Generische_Typen_008/readme.md) | [✅](Generische_Typen_008/solution/) | +| 70. | Generische Typen | [Generische Typen zusammen mit Wildcards einsetzen](Generische_Typen_009/readme.md) | [✅](Generische_Typen_009/solution/) | +| 71. | Geschachtelte Klassen | [Eigene compare-Methode schreiben](Geschachtelte_Klassen_001/readme.md) | [✅](Geschachtelte_Klassen_001/solution/) | +| 72. | Geschachtelte Klassen | [Innere Klasse Beobachter](Geschachtelte_Klassen_002/readme.md) | [✅](Geschachtelte_Klassen_002/solution/) | +| 73. | Geschachtelte Klassen | [Callback mit anonymer Klasse realisieren](Geschachtelte_Klassen_003/readme.md) | [✅](Geschachtelte_Klassen_003/solution/) | +| 74. | Lambdas | [Comparator als Lambda](Lambdas_001/readme.md) | [✅](Lambdas_001/solution/) | +| 75. | Lambdas | [Callback mit Lambda realisieren](Lambdas_002/readme.md) | [✅](Lambdas_002/solution/) | +| 76. | Geschachtelte Klassen | [MatrixSuche](Geschachtelte_Klassen_001/readme.md) | [✅](Geschachtelte_Klassen_001/solution/) | +| 77. | Lambdas | [StringTransmogrifier](Lambdas_001/readme.md) | [✅](Lambdas_001/solution/) | +| 78. | Lambdas | [StringTransmogrifier erweitern](Lambdas_002/readme.md) | [✅](Lambdas_002/solution/) | +| 79. | Collections | [Iterator schreiben](Collections_001/readme.md) | [✅](Collections_001/solution/) | +| 80. | Collections | [Iterator programmieren](Collections_002/readme.md) | [✅](Collections_002/solution/) | +| 81. | Collections | [`List` und dessen Implementierungen](Collections_003/readme.md) | [✅](Collections_003/solution/) | +| 82. | Collections | [`Map` verwenden](Collections_004/readme.md) | [✅](Collections_004/solution/) | +| 83. | Collections | [ReverserGeneric](Collections_005/readme.md) | [✅](Collections_005/solution/) | +| 84. | Collections | [Strings umgekehrt sortieren: Reverser](Collections_006/readme.md) | [✅](Collections_006/solution/) | +| 85. | Collections | [`Set` und dessen Implementierungen](Collections_007/readme.md) | [✅](Collections_007/solution/) | +| 86. | Collections | [CommandLineSorter](Collections_008/readme.md) | [✅](Collections_008/solution/) | +| 87. | Collections | [CommandLineSorter -- Version 2](Collections_009/readme.md) | [✅](Collections_009/solution/) | +| 88. | Collections | [`Comparator` verwenden und Objekte sortieren](Collections_010/readme.md) | [✅](Collections_010/solution/) | +| 89. | Collections | [Wörterbuchprogramm](Collections_011/readme.md) | [✅](Collections_011/solution/) | +| 90. | Streams | [Kleinbuchstaben in einem String zählen](Streams_001/readme.md) | [✅](Streams_001/solution/) | +| 91. | Streams | [Buchstaben in einer Liste von Strings zählen](Streams_002/readme.md) | [✅](Streams_002/solution/) | +| 92. | Streams | [Kleinbuchstaben in einem String zählen](Streams_003/readme.md) | [✅](Streams_003/solution/) | +| 93. | Streams | [Liste filtern](Streams_004/readme.md) | [✅](Streams_004/solution/) | +| 94. | Streams | [Streams mit interner Iteration](Streams_005/readme.md) | [✅](Streams_005/solution/) | +| 95. | Streams | [Map und Filter auf Streams](Streams_006/readme.md) | [✅](Streams_006/solution/) | +| 96. | Streams | [Map und Reduce auf Streams](Streams_007/readme.md) | [✅](Streams_007/solution/) | +| 97. | Streams | [Reduce](Streams_008/readme.md) | [✅](Streams_008/solution/) | +| 98. | Streams | [Summe über reduce bestimmen](Streams_009/readme.md) | [✅](Streams_009/solution/) | +| 99. | Streams | [Wörter zählen](Streams_010/readme.md) | [✅](Streams_010/solution/) | +| 100. | Threads | [Fakultät parallel berechnen](Threads_001/readme.md) | [✅](Threads_001/solution/) | +| 101. | Threads | [Thread per interrupt beenden](Threads_002/readme.md) | [✅](Threads_002/solution/) | +| 102. | Threads | [wait und notify benutzen](Threads_003/readme.md) | [✅](Threads_003/solution/) | +| 103. | Threads | [Parallele Ausgaben erzeugen](Threads_004/readme.md) | [✅](Threads_004/solution/) | +| 104. | Threads | [Race-Condition finden und beheben](Threads_005/readme.md) | [✅](Threads_005/solution/) | +| 105. | Threads | [Stack und Heap unterscheiden](Threads_006/readme.md) | [✅](Threads_006/solution/) | +| 106. | Threads | [synchronized verwenden](Threads_007/readme.md) | [✅](Threads_007/solution/) | +| 107. | Threads | [Timer und TimerTask verwenden](Threads_008/readme.md) | [✅](Threads_008/solution/) | +| 108. | Reflection | [Klasse per Reflection analysieren](Reflection_001/readme.md) | [✅](Reflection_001/solution/) | +| 109. | Reflection | [Objekte per Reflection erzeugen](Reflection_002/readme.md) | [✅](Reflection_002/solution/) | diff --git a/solutions/src/main/java/pr2/collections/iterator/SimpleStack.java b/solutions/src/main/java/pr2/collections/iterator/SimpleStack.java new file mode 100644 index 0000000..dd70937 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/iterator/SimpleStack.java @@ -0,0 +1,79 @@ +package pr2.collections.iterator; + +import java.util.Iterator; + +/** + * Eine einfache, naive Stack Implementierung. + * + * @param Typ, der gespeichert werden soll. + */ +public class SimpleStack implements Iterable { + + // Variablen sind nicht private wegen Zugriff durch den Iterator + T[] stack; + + int pos; + + /** + * Legt einen neuen Stack mit der gegebenen Größe an. + * + * @param size Größe des Stacks. + */ + @SuppressWarnings("unchecked") + public SimpleStack(int size) { + stack = (T[]) new Object[size]; + pos = 0; + } + + /** + * Fügt dem Stack ein neues Element hinzu. + * + * @param o Element, das hinzugefügt werden soll. + */ + public void push(T o) { + stack[pos++] = o; + } + + /** + * Holt das oberste Element und entfernt es. + * + * @return das oberste Element + */ + public T pop() { + return stack[--pos]; + } + + /** + * Gibt das oberste Element zurück, ohne es zu entfernen. + * + * @return das oberste Element + */ + public T peek() { + return stack[pos - 1]; + } + + + /** + * Erzeugt einen Iterator. + * + * @return Iterator + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + return new Iterator() { + + int iteratorPos = pos - 1; + + @Override + public boolean hasNext() { + return iteratorPos >= 0; + } + + @Override + public T next() { + return stack[iteratorPos--]; + } + }; + } +} diff --git a/solutions/src/main/java/pr2/collections/list/WordCollector.java b/solutions/src/main/java/pr2/collections/list/WordCollector.java new file mode 100644 index 0000000..e73c513 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/list/WordCollector.java @@ -0,0 +1,123 @@ +package pr2.collections.list; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * Klassen, um die in einem Text vorkommenden Wörter zu sammeln. + */ +public class WordCollector { + + + /** + * Listet alle Worte in der Datei alphabetisch auf. Duplikate werden + * entfernt. Die Wörter werden in Kleinbuchstaben umgewandelt. + * + * @param filename Dateiname + * @return die Liste der vorhandenen Worte + * @throws IOException Fehler beim Dateizugriff. + */ + public static List listWords(String filename) throws IOException { + List allWords = readFileAndSplitIntoWords(filename); + List result = removeDuplicates(allWords); + + return result; + } + + /** + * Listet alle Worte in der Datei auf. + * + * @param filename Dateiname + * @return die Liste der vorhandenen Worte + * @throws IOException Fehler beim Dateizugriff. + */ + private static List readFileAndSplitIntoWords(String filename) + throws IOException { + + // Datei zum Lesen öffnen + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + String line; // aktuelle Zeile + + List wordList = new LinkedList<>(); + + // Über die Zeilen der Datei iterieren + while ((line = reader.readLine()) != null) { + + // Sonderzeichen entfernen und die Zeilen in Worte splitten + line = line.toLowerCase(); + line = line.replaceAll("[\",.:'\\-!?]", ""); + + String[] words = line.toLowerCase().split("[,. ]"); + + // Worte in den Puffer übertragen + wordList.addAll(Arrays.asList(words)); + } + + reader.close(); + + return wordList; + } + + /** + * Sortiert das übergebene Array alphabetisch und entfernt Duplikate. + * + * @param input Eingabe Array + * @return sortiertes und bereinigtes Array + */ + @SuppressWarnings("PMD.AvoidReassigningLoopVariables") + private static List removeDuplicates(List input) { + + // Eingabe-Liste kopieren + List strings = new ArrayList<>(input); + + // Liste sortieren + Collections.sort(strings); + + // Über die Einträge laufen + for (int i = 0; i < strings.size(); i++) { + + String word = strings.get(i); + + // Über die Einträge laufen + for (int k = i + 1; k < strings.size(); k++) { + + String otherWord = strings.get(k); + + if (otherWord.compareTo(word) > 0) { + // Sind schon hinter der möglichen Position + break; + } + else if (otherWord.equals(word)) { + // Duplikat, entfernen + strings.remove(k); + k--; + } + } + } + + return strings; + } + + /** + * Hauptmethode. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + + try { + List words = listWords( + "kafka.txt"); + System.out.println(words); + } catch (IOException e) { + System.err.println("Probleme beim Dateizugriff: " + e); + } + } +} diff --git a/solutions/src/main/java/pr2/collections/list_iterator/Liste.java b/solutions/src/main/java/pr2/collections/list_iterator/Liste.java new file mode 100644 index 0000000..6833b72 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/list_iterator/Liste.java @@ -0,0 +1,57 @@ +package pr2.collections.list_iterator; + +import java.util.Iterator; +public class Liste implements Iterable { + + static class Item { + T element; + Item next; + + public Item(T element) { + this.element = element; + } + } + + Item first; + Item last; + + class ListenIterator implements Iterator { + Item position = first; + + @Override + public boolean hasNext() { + return (position != null); + } + + @Override + public T next() { + T element = position.element; + position = position.next; + return element; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } + + public void add(T element) { + Item item = new Item(element); + + first = (first != null) ? first : item; + + if (last == null) { + last = item; + } else { + last.next = item; + last = item; + } + + } + + @Override + public Iterator iterator() { + return new ListenIterator(); + } +} diff --git a/solutions/src/main/java/pr2/collections/map/WordCount.java b/solutions/src/main/java/pr2/collections/map/WordCount.java new file mode 100644 index 0000000..5c18fcf --- /dev/null +++ b/solutions/src/main/java/pr2/collections/map/WordCount.java @@ -0,0 +1,83 @@ +package pr2.collections.map; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Zählen von Worthäufigkeiten. + */ +public class WordCount { + + /** + * Listet alle Worte in der Datei und deren Häufigkeit auf. + * Die zurückgegebene Liste ist bereits nach der Häufigkeit + * sortiert. + * + * @param filename Dateiname + * @return die Liste der vorhandenen Wörter + * @throws IOException Fehler beim Dateizugriff. + */ + private static List countWords(String filename) + throws IOException { + + // Map mit dem Wort als Schlüssel und der Häufigkeit als Key + Map frequencyMap = new HashMap<>(); + + // Datei zum Lesen öffnen + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + String line; // aktuelle Zeile + + // Über die Zeilen der Datei iterieren + while ((line = reader.readLine()) != null) { + + // Sonderzeichen entfernen und die Zeilen in Worte splitten + line = line.toLowerCase(); + line = line.replaceAll("[\",.:;)'\\-!?]", ""); + + String[] words = line.toLowerCase().split("[,. ]"); + + for (String word : words) { + WordFrequency entry = frequencyMap.get(word); + if (entry == null) { + entry = new WordFrequency(word, 0); + frequencyMap.put(word, entry); + } + + entry.incrementFrequency(); + } + } + + reader.close(); + + List liste = new ArrayList<>(frequencyMap.values()); + Collections.sort(liste); + + return liste; + } + + /** + * Hauptmethode. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + + try { + List words = countWords( + "kafka.txt"); + + for (WordFrequency word : words) { + System.out.println(word); + } + } catch (IOException e) { + System.err.println("Probleme beim Dateizugriff: " + e); + } + } +} diff --git a/solutions/src/main/java/pr2/collections/map/WordFrequency.java b/solutions/src/main/java/pr2/collections/map/WordFrequency.java new file mode 100644 index 0000000..1b1cea1 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/map/WordFrequency.java @@ -0,0 +1,56 @@ +package pr2.collections.map; + +/** + * Klasse für die Verwaltung der Worthäufigkeiten. + */ +public class WordFrequency implements Comparable { + + /** + * Das Wort. + */ + String word; + + /** + * Seine Häufigkeit. + */ + int frequency; + + /** + * Legt ein neues Objekt an. + * + * @param word das gespeicherte Wort + * @param frequency die Häfigkeit + */ + WordFrequency(String word, int frequency) { + this.word = word; + this.frequency = frequency; + } + + + /** + * Vergleich mit anderem Objekt. + * + * @param o das andere Objekt + * @return Ergebnis des Vergleiches + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + @Override + public int compareTo(WordFrequency o) { + return o.frequency - frequency; + } + + /** + * Erhöht die Häufigkeit des Wortes. + */ + public void incrementFrequency() { + frequency++; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("%s: %d", word, frequency); + } +} diff --git a/solutions/src/main/java/pr2/collections/reverser/Reverser.java b/solutions/src/main/java/pr2/collections/reverser/Reverser.java new file mode 100644 index 0000000..0025563 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/reverser/Reverser.java @@ -0,0 +1,18 @@ +package pr2.collections.reverser; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class Reverser { + public void reverse(List liste) { + + Collections.sort(liste, new Comparator() { + + @Override + public int compare(String o1, String o2) { + return o1.compareTo(o2) * -1; + } + }); + } +} diff --git a/solutions/src/main/java/pr2/collections/reverser_generic/Reverser.java b/solutions/src/main/java/pr2/collections/reverser_generic/Reverser.java new file mode 100644 index 0000000..5d03b9d --- /dev/null +++ b/solutions/src/main/java/pr2/collections/reverser_generic/Reverser.java @@ -0,0 +1,19 @@ +package pr2.collections.reverser_generic; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class Reverser> { + + public void reverse(List liste) { + + Collections.sort(liste, new Comparator() { + + @Override + public int compare(T o1, T o2) { + return o1.compareTo(o2) * -1; + } + }); + } +} diff --git a/solutions/src/main/java/pr2/collections/set/WordCollector.java b/solutions/src/main/java/pr2/collections/set/WordCollector.java new file mode 100644 index 0000000..8c8fcc5 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/set/WordCollector.java @@ -0,0 +1,81 @@ +package pr2.collections.set; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Klassen, um die in einem Text vorkommenen Wörter zu sammeln. + */ +public class WordCollector { + + + /** + * Listet alle Worte in der Datei alphabetisch auf. Duplikate werden + * entfernt. Die Wörter werden in Kleinbuchstaben umgewandelt. + * + * @param filename Dateiname + * @return die Liste der vorhandenen Worte + * @throws IOException Fehler beim Dateizugriff. + */ + public static List listWords(String filename) throws IOException { + Set allWords = readFileAndSplitIntoWords(filename); + List wordsSorted = new ArrayList<>(allWords); + Collections.sort(wordsSorted); + return wordsSorted; + } + + /** + * Listet alle Worte in der Datei auf. + * + * @param filename Dateiname + * @return die Liste der vorhandenen Worte + * @throws IOException Fehler beim Dateizugriff. + */ + private static Set readFileAndSplitIntoWords(String filename) + throws IOException { + + // Datei zum Lesen öffnen + BufferedReader reader = new BufferedReader(new FileReader(filename)); + + String line; // aktuelle Zeile + Set wordBuffer = new HashSet<>(); // Puffer für die Worte + + // Über die Zeilen der Datei iterieren + while ((line = reader.readLine()) != null) { + + // Sonderzeichen entfernen und die Zeilen in Worte splitten + line = line.replaceAll("[\",.:'\\-!?]", ""); + + String[] words = line.toLowerCase().split("[,. ]"); + + // Worte in den Puffer übertragen + wordBuffer.addAll(Arrays.asList(words)); + } + + reader.close(); + + return wordBuffer; + } + + /** + * Hauptmethode. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + + try { + List words = listWords("kafka.txt"); + System.out.println(words); + } catch (IOException e) { + System.err.println("Probleme beim Dateizugriff: " + e); + } + } +} diff --git a/solutions/src/main/java/pr2/collections/sorter_1/CommandLineSorter.java b/solutions/src/main/java/pr2/collections/sorter_1/CommandLineSorter.java new file mode 100644 index 0000000..471bf93 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/sorter_1/CommandLineSorter.java @@ -0,0 +1,17 @@ +package pr2.collections.sorter_1; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class CommandLineSorter { + + public static void main(String[] args) { + List argList = Arrays.asList(args); + Collections.sort(argList); + + for (String element : argList) { + System.out.println(element); + } + } +} diff --git a/solutions/src/main/java/pr2/collections/sorter_2/CommandLineSorter.java b/solutions/src/main/java/pr2/collections/sorter_2/CommandLineSorter.java new file mode 100644 index 0000000..6ab92bb --- /dev/null +++ b/solutions/src/main/java/pr2/collections/sorter_2/CommandLineSorter.java @@ -0,0 +1,16 @@ +package pr2.collections.sorter_2; + +import java.util.Arrays; +import java.util.Set; +import java.util.TreeSet; + +public class CommandLineSorter { + + public static void main(String[] args) { + Set argList = new TreeSet(Arrays.asList(args)); + + for (String element : argList) { + System.out.println(element); + } + } +} diff --git a/solutions/src/main/java/pr2/collections/sortieren/Sorter.java b/solutions/src/main/java/pr2/collections/sortieren/Sorter.java new file mode 100644 index 0000000..2efeeb9 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/sortieren/Sorter.java @@ -0,0 +1,83 @@ +package pr2.collections.sortieren; + +import java.util.Arrays; +import java.util.Comparator; + +/** + * Klasse zum Sortieren von Strings. + */ +public class Sorter { + + /** + * Liefert einen Comparator für Strings. + * + * @param order Sortierreihenfolge. + * @return Comparator, entsprechend der gewünschten Sortierreihenfolge. + */ + private static Comparator stringComparator(final SortOrder order) { + /* Comparator. */ + class MyComparator implements Comparator { + + /** + * Vergleicht die Strings. + * + * @param o1 Erster String + * @param o2 Zweiter String + * @return Ergebnis des Vergleichs. + */ + @Override + public int compare(String o1, String o2) { + switch (order) { + case ASCENDING: + return o1.compareTo(o2); + case DESCENDING: + return -o1.compareTo(o2); + case ASCENDING_CASE_INSENSITIVE: + return o1.toUpperCase().compareTo(o2.toUpperCase()); + case DESCENDING_CASE_INSENSITIVE: + return -o1.toUpperCase().compareTo(o2.toUpperCase()); + default: + throw new IllegalArgumentException(); + } + } + } + + return new MyComparator(); + } + + /** + * Sortiert das übergebene Array entsprechend der gewünschten Reihenfolge. + * + * @param array das zu sortierende Array. + * @param order die Sortierreihenfolge. + */ + public static void sort(String[] array, SortOrder order) { + Arrays.sort(array, stringComparator(order)); + } + + /** + * Sortierreihenfolge für die Strings. + */ + public enum SortOrder { + + /** + * Aufsteigend. + */ + ASCENDING, + + /** + * Absteigend. + */ + DESCENDING, + + /** + * Aufsteigend, ohne Beachtung der Groß-/Kleinschreibung. + */ + ASCENDING_CASE_INSENSITIVE, + + /** + * Absteigend, ohne Beachtung der Groß-/Kleinschreibung. + */ + DESCENDING_CASE_INSENSITIVE + } +} diff --git a/solutions/src/main/java/pr2/collections/woerterbuch/Woerterbuch.java b/solutions/src/main/java/pr2/collections/woerterbuch/Woerterbuch.java new file mode 100644 index 0000000..9a4d618 --- /dev/null +++ b/solutions/src/main/java/pr2/collections/woerterbuch/Woerterbuch.java @@ -0,0 +1,37 @@ +package pr2.collections.woerterbuch; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class Woerterbuch { + + private static final Map WOERTER; + + static { + Map map = new HashMap(); + map.put("gehen", "go"); + map.put("schlafen", "sleep"); + map.put("tanzen", "dance"); + map.put("springen", "jump"); + + WOERTER = Collections.unmodifiableMap(map); + } + + public static void main(String[] args) { + if (args.length == 0) { + System.err.println("Bitte mindestens ein Wort angeben!"); + System.exit(1); + } + + for (String wort : args) { + String uebersetzung = WOERTER.get(wort); + + if (uebersetzung == null) { + uebersetzung = ""; + } + + System.out.printf("%s => %s%n", wort, uebersetzung); + } + } +} diff --git a/solutions/src/main/java/pr2/enums/eigene/Wuerfel.java b/solutions/src/main/java/pr2/enums/eigene/Wuerfel.java new file mode 100644 index 0000000..beeb3a2 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/eigene/Wuerfel.java @@ -0,0 +1,38 @@ +package pr2.enums.eigene; + +import java.util.Random; + +/** + * Ein einfacher Würfel. + */ +public class Wuerfel { + + + /** + * Zufallszahlengenerator. + */ + private final Random rnd = new Random(); + + /** + * Anzahl der Seiten des Würfels. + */ + private final int numSides; + + /** + * Einen neuen Würfel anlegen. + * + * @param typ Anzahl der Seiten des Würfels. + */ + public Wuerfel(WuerfelTyp typ) { + this.numSides = typ.getSeiten(); + } + + /** + * Den Würfel werfen. + * + * @return Ergebnis des Wurfes. + */ + public int roll() { + return rnd.nextInt(numSides) + 1; + } +} diff --git a/solutions/src/main/java/pr2/enums/eigene/WuerfelTyp.java b/solutions/src/main/java/pr2/enums/eigene/WuerfelTyp.java new file mode 100644 index 0000000..19047f9 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/eigene/WuerfelTyp.java @@ -0,0 +1,70 @@ +package pr2.enums.eigene; + +/** + * Enumeration für die verschiedenen Würfel-Typen. + */ +public enum WuerfelTyp { + + /** + * 4-seitiger Würfel. + */ + D4(4), + + /** + * 6-seitiger Würfel. + */ + D6(6), + + /** + * 8-seitiger Würfel. + */ + D8(8), + + /** + * 10-seitiger Würfel. + */ + D10(10), + + /** + * 12-seitiger Würfel. + */ + D12(12), + + /** + * 20-seitiger Würfel. + */ + D20(20); + + /** + * Anzahl der Seiten. + */ + private final int seiten; + + /** + * Neue Instanz anlegen. + * + * @param seiten Anzahl der Seiten. + */ + WuerfelTyp(int seiten) { + this.seiten = seiten; + } + + /** + * Anzahl der Seiten. + * + * @return Anzahl der Seiten. + */ + public int getSeiten() { + return seiten; + } + + /** + * Durchschnittliche Augenzahl bei einer großen Anzahl von + * Würfen. + * + * @return Durchschnittliche Augenzahl. + */ + public double average() { + return 0.5 * (seiten + 1); + } +} diff --git a/solutions/src/main/java/pr2/enums/filme/LieblingsFilme.java b/solutions/src/main/java/pr2/enums/filme/LieblingsFilme.java new file mode 100644 index 0000000..7ae95b1 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/filme/LieblingsFilme.java @@ -0,0 +1,50 @@ +package pr2.enums.filme; + +public enum LieblingsFilme { + + /** + * Pulp Fiction. + */ + PULP_FICTION("Pulp Fiction", "Quentin Tarantino", 9), + /** + * Fight Club. + */ + FIGHT_CLUB("Fight Club", "David Fincher", 9), + /** + * Twelve Monkeys. + */ + TWELVE_MONKEYS("Twelve Monkeys", "Terry Giliam", 8), + /** + * Killer Tomatos. + */ + KILLER_TOMATOES("Attack of the Killer Tomatoes", "John de Bello", 4); + + private final String name; + private final int bewertung; + private final String regisseur; + + private LieblingsFilme(String name, String regisseur, + int bewertung) { + this.name = name; + this.regisseur = regisseur; + this.bewertung = bewertung; + } + + public String getName() { + return name; + } + + public int getBewertung() { + return bewertung; + } + + public String getRegisseur() { + return regisseur; + } + + @Override + public String toString() { + return String.format("'%s' von %s; Bewertung %d", name, + regisseur, bewertung); + } +} diff --git a/solutions/src/main/java/pr2/enums/filme/Main.java b/solutions/src/main/java/pr2/enums/filme/Main.java new file mode 100644 index 0000000..8a53673 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/filme/Main.java @@ -0,0 +1,9 @@ +package pr2.enums.filme; + +public class Main { + public static void main(String[] args) { + for (LieblingsFilme f : LieblingsFilme.values()) { + System.out.println(f); + } + } +} diff --git a/solutions/src/main/java/pr2/enums/schnick/Move.java b/solutions/src/main/java/pr2/enums/schnick/Move.java new file mode 100644 index 0000000..eccdd75 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/schnick/Move.java @@ -0,0 +1,46 @@ +package pr2.enums.schnick; + +public enum Move { + /** + * Konstante für Schere. + */ + SCISSORS("Scissors", "s"), + + /** + * Konstante für Papier. + */ + PAPER("Paper", "p"), + + /** + * Konstante für Stein. + */ + ROCK("Rock", "r"); + + private final String name; + private final String key; + + private Move(String name, String key) { + this.name = name; + this.key = key; + } + + @Override + public String toString() { + return name; + } + + /** + * Returns the move corresponding to the key entered. + * + * @param key the key pressed. + * @return the corresponding move. + */ + public static Move find(String key) { + for (Move m : values()) { + if (m.key.equals(key.toLowerCase())) { + return m; + } + } + return null; + } +} diff --git a/solutions/src/main/java/pr2/enums/schnick/SchnickSchnackSchnuck.java b/solutions/src/main/java/pr2/enums/schnick/SchnickSchnackSchnuck.java new file mode 100644 index 0000000..68ada87 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/schnick/SchnickSchnackSchnuck.java @@ -0,0 +1,89 @@ +package pr2.enums.schnick; + +import java.util.Random; +import java.util.Scanner; + +/** + * Schick - Schnack - Schnuck (Rock - Paper - Scissors). + */ +public class SchnickSchnackSchnuck { + + /** + * Vergleicht den Zug zweier Spieler. + * + * @param a Zug von Spieler a. + * @param b Zug von Spieler b. + * @return 1 spieler a hat gewonnen, 0, unentschieden, -1 spieler b + * hat gewonnen. + */ + private static int compare(Move a, Move b) { + + if (a == b) { + return 0; + } + else if (a == Move.SCISSORS && b == Move.PAPER) { + return 1; + } + else if (a == Move.ROCK && b == Move.SCISSORS) { + return 1; + } + else if (a == Move.PAPER && b == Move.ROCK) { + return 1; + } + else { + return compare(b, a) * -1; + } + } + + public static void main(String[] args) { + + Scanner scanner = new Scanner(System.in); + Random rnd = new Random(); + + int pointsPlayer = 0; + int pointsComputer = 0; + + // Play three rounds + for (int i = 0; i < 3; i++) { + + // Read the player's choice + Move movePlayer = null; + + while (movePlayer == null) { + System.out.printf( + "\nRunde %s: Dein Zug ([r]rock, [p]aper, [s]cissors)? ", + i); + String move = scanner.nextLine().trim(); + movePlayer = Move.find(move); + } + + // Random move of the computer + Move moveComputer = + Move.values()[rnd.nextInt(2)]; + + // Compare moves + int winner = compare(movePlayer, moveComputer); + + String winnerText; + + if (winner == 1) { + pointsPlayer++; + winnerText = "Du hast gewonnen"; + } else if (winner == -1) { + pointsComputer++; + winnerText = "Der Computer hat gewonnen"; + } else { + winnerText = "Unentschieden"; + } + System.out.printf("%s: %s, Computer: %s - [%d:%d]\n", + winnerText, + movePlayer, moveComputer, + pointsPlayer, pointsComputer); + } + + System.out.printf( + "\nErgebnis - Du %d Punkt(e), " + + "Computer %d Punkt(e)", + pointsPlayer, pointsComputer); + } +} diff --git a/solutions/src/main/java/pr2/enums/singleton/MyEnum.java b/solutions/src/main/java/pr2/enums/singleton/MyEnum.java new file mode 100644 index 0000000..be83cc0 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/singleton/MyEnum.java @@ -0,0 +1,7 @@ +package pr2.enums.singleton; + +enum MyEnum { + A, + B, + C; +} diff --git a/solutions/src/main/java/pr2/enums/singleton/SingletonBeweis.java b/solutions/src/main/java/pr2/enums/singleton/SingletonBeweis.java new file mode 100644 index 0000000..327cf52 --- /dev/null +++ b/solutions/src/main/java/pr2/enums/singleton/SingletonBeweis.java @@ -0,0 +1,14 @@ +package pr2.enums.singleton; + +public class SingletonBeweis { + + public static void main(String[] args) { + MyEnum e1 = MyEnum.A; + MyEnum e2 = MyEnum.valueOf("A"); + MyEnum e3 = MyEnum.values()[0]; + + System.out.println(e1 == e2); + System.out.println(e2 == e3); + System.out.println(e1 == e3); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/CrypterCaesar.java b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/CrypterCaesar.java new file mode 100644 index 0000000..5b9f0ab --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/CrypterCaesar.java @@ -0,0 +1,164 @@ +package pr2.exceptions.ausnahmen_testen; + +/** + * Implementierung einer Caesar-Verschlüsselung. + *

+ * Der Eingabetext ({@literal message}) darf nur aus den Groß-Buchstaben A-Z + * bestehen. Alle anderen Zeichen (einschließlich der Leerzeichen) führen zu + * einer entsprechenden Ausnahme. + *

+ * Dasselbe gilt für die Entschlüsselung. Auch hier dürfen nur gültige + * Zeichen auftauchen. Andernfalls kommt es zu einer Ausnahme. + *

+ * Der Schlüssel darf nur aus einem einzelnen Zeichen bestehen und muss + * ebenfalls aus dem Bereich A-Z stammen. Kleinbuchstaben oder andere + * Zeichen führen zu einer Ausnahme. + *

+ * Zwischen den beiden Methoden muss bei gleichem Schlüssel {@code key} + * folgendes gelten: + *

+ * {@code text.equals(decrypt(key, encrypt(key, text)) == true}. + */ +public class CrypterCaesar { + + /** + * Gültige Zeichen für Schlüssel und Text. + */ + protected static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + /** + * Verschlüsselt den gegebenen Text mit dem angegebenen Schlüssel. + * + * @param key Schlüssel, der verwendet werden soll. + * @param message Nachricht, die Verschlüsselt werden soll. + * @return verschlüsselter Text. + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + public String encrypt(String key, String message) + throws IllegalMessageException, IllegalKeyException { + + checkKeyAndMessage(key, message); + + int shift = key.charAt(0) - 'A' + 1; + return shift(message, shift); + } + + /** + * Entschlüsselt den gegebenen Text mit dem angegebenen Schlüssel. + * + * @param key Schlüssel, der verwendet werden soll. + * @param cypherText Nachricht, die entschlüsselt werden soll. + * @return entschlüsselter Text. + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + public String decrypt(String key, String cypherText) + throws IllegalKeyException, IllegalMessageException { + + checkKeyAndMessage(key, cypherText); + + int shift = key.charAt(0) - 'A' + 1; + return shift(cypherText, -shift); + } + + /** + * Verschiebt die Zeichen im Text um den gegebenen Faktor. + * + * @param text Nachricht + * @param shift Verschiebefaktor + * @return das Ergebnis als String + */ + private String shift(String text, int shift) { + + StringBuilder result = new StringBuilder(); + + for (char c : text.toCharArray()) { + char newChar = (char) (c + shift); + + if (newChar > 'Z') { + // Überlauf nach hinten + newChar = (char) (newChar - ('Z' - 'A' + 1)); + } + else if (newChar < 'A') { + // Überlauf nach vorne + newChar = (char) (newChar + ('Z' - 'A' + 1)); + } + + result.append(newChar); + } + + return result.toString(); + } + + /** + * Prüft Schlüssel und Nachricht. + * + * @param key der Schlüssel + * @param message die Nachricht + * @throws IllegalKeyException Schlüssel nicht OK + * @throws IllegalMessageException Nachricht nicht OK + */ + private void checkKeyAndMessage(String key, String message) + throws IllegalKeyException, IllegalMessageException { + + if (!checkKey(key)) { + throw new IllegalKeyException(key); + } + + if (!checkCharacters(message, ALPHABET)) { + throw new IllegalMessageException(key); + } + } + + /** + * Testet den Schlüssel auf Korrektheit: Er muss mindestens die Länge 1 + * haben und darf nur Zeichen von A-Z enthalten. + * + * @param key zu testender Schlüssel + * @return {@code true} if characters are ok, otherwise {@code false} + */ + protected boolean checkKey(String key) { + + if (key.length() != 1) { + return false; + } + + return checkCharacters(key, ALPHABET); + } + + /** + * Checks the given input to ensure that it only contains the given + * character set and no other characters. + * + * @param inputChars the string to be checked + * @param charSet a string containing all allowed characters + * @return {@code true} if characters are ok, otherwise {@code false} + */ + protected boolean checkCharacters(char[] inputChars, String charSet) { + + for (char c : inputChars) { + if (charSet.indexOf(c) == -1) { + return false; + } + } + + return true; + } + + /** + * Checks the given input to ensure that it only contains the given + * character set and no other characters. + * + * @param input the string to be checked + * @param charSet a string containing all allowed characters + * @return {@code true} if characters are ok, otherwise {@code false} + */ + protected boolean checkCharacters(String input, String charSet) { + return checkCharacters(input.toCharArray(), charSet); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalKeyException.java b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalKeyException.java new file mode 100644 index 0000000..469e5bf --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalKeyException.java @@ -0,0 +1,31 @@ +package pr2.exceptions.ausnahmen_testen; + +/** + * Ungültiger Schlüssel. + */ +public class IllegalKeyException extends Exception { + + /** + * Legt eine neue Ausnahme an. + */ + public IllegalKeyException() { + super(); + } + + /** + * Legt eine neue Ausnahme an. + * + * @param message die Nachricht. + */ + public IllegalKeyException(String message) { + super(message); + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return getMessage(); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalMessageException.java b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalMessageException.java new file mode 100644 index 0000000..141a2b7 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/ausnahmen_testen/IllegalMessageException.java @@ -0,0 +1,31 @@ +package pr2.exceptions.ausnahmen_testen; + +/** + * Ungültige Nachricht. + */ +public class IllegalMessageException extends Exception { + + /** + * Legt eine neue Ausnahme an. + */ + public IllegalMessageException() { + super(); + } + + /** + * Legt eine neue Ausnahme an. + * + * @param message die Nachricht. + */ + public IllegalMessageException(String message) { + super(message); + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return getMessage(); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/Fuse.java b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/Fuse.java new file mode 100644 index 0000000..f71ecb5 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/Fuse.java @@ -0,0 +1,58 @@ +package pr2.exceptions.eigene_ausnahme; + +/** + * Eine Sicherung im Stromkreis. + */ +public class Fuse { + + /** + * 16 Ampere-Sicherung. + */ + public static final int A16 = 16; + + /** + * 25 Ampere-Sicherung. + */ + public static final int A25 = 25; + + /** + * 32 Ampere-Sicherung. + */ + public static final int A32 = 32; + + /** + * Strom, bei dem die Sicherung auslöst. + */ + private final int tripCurrent; + + /** + * Legt eine neue Sicherung an. + * + * @param tripCurrent Strom, bei dem die Sicherung auslösen soll. + * @throws IllegalCurrentException Ausnahme bei einem + * ungültigen Spannungswert. + */ + public Fuse(int tripCurrent) throws IllegalCurrentException { + switch (tripCurrent) { + case A16: + case A25: + case A32: + this.tripCurrent = tripCurrent; + break; + default: + throw new IllegalCurrentException(tripCurrent); + } + } + + /** + * Die Sicherung benutzen. + * + * @param current Strom, der durch die Sicherung fließt. + * @throws FuseTrippedException wird geworfen, wenn der Srom zu groß wird. + */ + public void use(int current) throws FuseTrippedException { + if (current > tripCurrent) { + throw new FuseTrippedException(current, tripCurrent); + } + } +} diff --git a/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/FuseTrippedException.java b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/FuseTrippedException.java new file mode 100644 index 0000000..06406a0 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/FuseTrippedException.java @@ -0,0 +1,37 @@ +package pr2.exceptions.eigene_ausnahme; + +/** + * Ausnahme, wenn die Sicherung auslöst. + */ +public class FuseTrippedException extends Exception { + /** + * Strom, bei dem die Sicherung ausgelöst hat. + */ + private final int current; + + /** + * Auslösestrom der Sicherung. + */ + private final int tripCurrent; + + /** + * Erzeugt eine neue Ausnahme. + * + * @param current Strom, bei dem die Sicherung ausgelöst hat. + * @param tripCurrent Auslösestrom der Sicherung. + */ + public FuseTrippedException(int current, int tripCurrent) { + super(); + this.current = current; + this.tripCurrent = tripCurrent; + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return String.format("Maximaler Strom: %d, Auslösestrom: %d", + tripCurrent, current); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/IllegalCurrentException.java b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/IllegalCurrentException.java new file mode 100644 index 0000000..2a163c9 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/eigene_ausnahme/IllegalCurrentException.java @@ -0,0 +1,30 @@ +package pr2.exceptions.eigene_ausnahme; + +/** + * Ausnahme, wenn eine Sicherung angelegt werden soll, die es nicht gibt. + */ +public class IllegalCurrentException extends Exception { + + /** + * Übergebener Strom. + */ + private final int givenValue; + + /** + * Erzeugt eine neue Ausnahme. + * + * @param givenValue gegebener Strom. + */ + public IllegalCurrentException(int givenValue) { + super(); + this.givenValue = givenValue; + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return String.format("Falscher Wert %d", givenValue); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/fakultaet/Fakultaet.java b/solutions/src/main/java/pr2/exceptions/fakultaet/Fakultaet.java new file mode 100644 index 0000000..1f03a7c --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/fakultaet/Fakultaet.java @@ -0,0 +1,18 @@ +package pr2.exceptions.fakultaet; + +public class Fakultaet { + + public int fact(int n) throws FakultaetException { + if (n < 0) { + throw new FakultaetException("Keine negativen Zahlen!", n); + } + else if (n > 20) { + throw new FakultaetException("Keine Zahlen > 20", n); + } + return factIntern(n); + } + + private int factIntern(int n) { + return (n == 0) ? 1 : factIntern(n - 1) * n; + } +} diff --git a/solutions/src/main/java/pr2/exceptions/fakultaet/FakultaetException.java b/solutions/src/main/java/pr2/exceptions/fakultaet/FakultaetException.java new file mode 100644 index 0000000..6ef0290 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/fakultaet/FakultaetException.java @@ -0,0 +1,15 @@ +package pr2.exceptions.fakultaet; + +public class FakultaetException extends Exception { + + private final int zahl; + + public FakultaetException(String message, int zahl) { + super(message); + this.zahl = zahl; + } + + public int getZahl() { + return zahl; + } +} diff --git a/solutions/src/main/java/pr2/exceptions/handle_or_declare/Buchstabenzaehler.java b/solutions/src/main/java/pr2/exceptions/handle_or_declare/Buchstabenzaehler.java new file mode 100644 index 0000000..5007c34 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/handle_or_declare/Buchstabenzaehler.java @@ -0,0 +1,120 @@ +package pr2.exceptions.handle_or_declare; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Scanner; + +/** + * Anwendung, die die Buchstabenhäufigkeit in einem Text analysiert. + */ +public class Buchstabenzaehler { + + /** + * Einstiegspunkt in das Programm. + * + * @param args Kommandozeilenargumente + */ + public static void main(String[] args) { + Buchstabenzaehler bs = new Buchstabenzaehler(); + try { + bs.run(); + } + catch (StatistikException e) { + System.out.println("Statistik-Fehler: " + e); + } + } + + /** + * Startet den Buchstabenzaehler. + * + * @throws StatistikException Fehler bei der Berechnung der + * Buchstabenhäufigkeit. + */ + private void run() throws StatistikException { + System.out.print("Bitte geben Sie den Dateinamen an: "); + Scanner scanner = new Scanner(System.in); + String dateiname = scanner.nextLine(); + + int[] statistik; + + try { + statistik = parseFile("assets/" + dateiname); + printStatistik(statistik); + } + catch (FileNotFoundException e) { + System.out.println("Datei gibt es nicht"); + } + catch (IOException e) { + System.out.println("Fehler beim Zugriff auf die Datei: " + e); + } + finally { + scanner.close(); + } + } + + /** + * Druckt die Statistik aus. + * + * @param statistik Statistik + * @throws StatistikException Fehler bei den Eingabedaten + */ + private void printStatistik(int[] statistik) throws StatistikException { + + int summe = 0; + + for (int haeufigkeit : statistik) { + summe += haeufigkeit; + } + + double prozentSumme = 0.0; + + for (char c = 'a'; c <= 'z'; c++) { + int anzahl = statistik[c - 'a']; + double prozent = (double) anzahl / (double) summe * 100; + System.out.printf("%s: %.2f%% %n", "" + c, prozent); + + prozentSumme += prozent; + } + + if ((prozentSumme < 99.0) || (prozentSumme > 101.0)) { + throw new StatistikException(Double.toString(prozentSumme)); + } + + System.out.printf("Summe: %.2f%% %n", prozentSumme); + } + + /** + * Analysiert die übergebene Datei und berechnet die Buchstabenhäufigkeit. + * + * @param filename Dateiname + * @return die Buchstabenhäufigkeit. Das 'a' ist das erste Element, + * das 'b' das zweite etc. + * @throws IOException generelles IO-Problem + * @throws FileNotFoundException Datei gibt es nicht + */ + private int[] parseFile(String filename) + throws IOException, FileNotFoundException { + + int[] statistik = new int['z' - 'a' + 1]; + + BufferedReader br = new BufferedReader(new FileReader(filename)); + + String line; + + while ((line = br.readLine()) != null) { + char[] chars = line.toLowerCase().toCharArray(); + + for (char c : chars) { + if (('a' <= c) && (c <= 'z')) { + statistik[c - 'a']++; + } + } + } + + br.close(); + + return statistik; + } +} diff --git a/solutions/src/main/java/pr2/exceptions/handle_or_declare/StatistikException.java b/solutions/src/main/java/pr2/exceptions/handle_or_declare/StatistikException.java new file mode 100644 index 0000000..0d83170 --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/handle_or_declare/StatistikException.java @@ -0,0 +1,31 @@ +package pr2.exceptions.handle_or_declare; + +/** + * Ausnahme, wenn die Statisitk nicht konsistent ist. + */ +public class StatistikException extends Exception { + + /** + * Legt eine neue Ausnahme an. + */ + public StatistikException() { + super(); + } + + /** + * Legt eine neue Ausnahme an. + * + * @param message die Nachricht. + */ + public StatistikException(String message) { + super(message); + } + + /** + * @see java.lang.Throwable#toString() + */ + @Override + public String toString() { + return getMessage(); + } +} diff --git a/solutions/src/main/java/pr2/exceptions/try_catch/Zahlenraten.java b/solutions/src/main/java/pr2/exceptions/try_catch/Zahlenraten.java new file mode 100644 index 0000000..5750c5a --- /dev/null +++ b/solutions/src/main/java/pr2/exceptions/try_catch/Zahlenraten.java @@ -0,0 +1,68 @@ +package pr2.exceptions.try_catch; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Random; + +/** + * Ein simples Zahlenraten-Spiel. + */ +public final class Zahlenraten { + + /** + * Liest einen String von der Tastatur. + * + * @return der gelesene String + * @throws IOException Probleme mit der Console + */ + private static String readNumber() throws IOException { + BufferedReader br = + new BufferedReader(new InputStreamReader(System.in)); + return br.readLine(); + } + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente + */ + public static void main(String[] args) { + + // zu ratende Zahl bestimmen + int zahl = new Random().nextInt(100) + 1; + + int versuche = 0; + + while (true) { + System.out.print("Bitte geben Sie eine Zahl ein: "); + + int geraten; + + try { + geraten = Integer.parseInt(readNumber()); + } + catch (IOException e) { + System.out.println("Problem mit der Konsole."); + break; + } + catch (NumberFormatException e) { + System.out.println("Bitte nur Zahlen eingeben!"); + continue; + } + + versuche++; + + if (geraten < zahl) { + System.out.println("Zu niedrig"); + } + else if (geraten > zahl) { + System.out.println("Zu hoch."); + } + else { + System.out.printf("Richtig in %d Versuchen", versuche); + break; + } + } + } +} diff --git a/solutions/src/main/java/pr2/generics/einfach/Liste.java b/solutions/src/main/java/pr2/generics/einfach/Liste.java new file mode 100644 index 0000000..320a8d5 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/einfach/Liste.java @@ -0,0 +1,88 @@ +package pr2.generics.einfach; + +/** + * Eine einfache, verkettete Liste. + * + * @param Typ der gespeicherten Objekte + */ +public class Liste { + + /** + * Referenz auf den ersten Knoten. + */ + private ListeNode first; + + /** + * Referenz auf den aktuellen Knoten. + */ + private ListeNode current; + + /** + * Fügt ein neues Element an das Ende der Liste an. + * + * @param data das Element + */ + public void add(T data) { + + ListeNode nextNode = new ListeNode<>(data); + + if (current == null) { + // Liste komplett leer + first = nextNode; + current = nextNode; + } + else { + current.next = nextNode; + current = nextNode; + } + } + + /** + * Liest das Element an der gegebenen Position. + * + * @param index Index, beginnend bei 0. + * @return Das Element oder {@code null}, wenn es nicht gefunden wurde. + */ + public T get(int index) { + int count = 0; + ListeNode node = first; + + while ((node != null) && (count < index)) { + node = node.next; + count++; + } + + if ((count == index) && (node != null)) { + return node.data; + } + else { + // index does not exist + return null; + } + } + + /** + * Löscht die Liste und entfernt alle Elemente. + */ + public void clear() { + first = null; + current = null; + } + + /** + * Liefert die Anzahl der Elemente der Liste zurück. + * + * @return die Anzahl der Elemente. + */ + public int size() { + int count = 0; + ListeNode node = first; + + while (node != null) { + node = node.next; + count++; + } + + return count; + } +} diff --git a/solutions/src/main/java/pr2/generics/einfach/ListeNode.java b/solutions/src/main/java/pr2/generics/einfach/ListeNode.java new file mode 100644 index 0000000..819357c --- /dev/null +++ b/solutions/src/main/java/pr2/generics/einfach/ListeNode.java @@ -0,0 +1,28 @@ +package pr2.generics.einfach; + +/** + * Interne Repräsentation der Knoten in der Liste. + * + * @param Typ der gespeicherten Daten. + */ +class ListeNode { + + /** + * Daten. + */ + T data; + + /** + * Referenz auf den nächsten Knoten. + */ + ListeNode next; + + /** + * Legt einen neuen Knoten an. + * + * @param data daten, die gespeichert werden + */ + ListeNode(T data) { + this.data = data; + } +} diff --git a/solutions/src/main/java/pr2/generics/number_pair/Main.java b/solutions/src/main/java/pr2/generics/number_pair/Main.java new file mode 100644 index 0000000..fcbc53b --- /dev/null +++ b/solutions/src/main/java/pr2/generics/number_pair/Main.java @@ -0,0 +1,15 @@ +package pr2.generics.number_pair; + +public class Main { + public static void main(String[] args) { + var note = new Pair("Peter", 1); + var name = new Pair("Peter", "Meier"); + var tel = new NumberPair(621, 292122); + + System.out.printf("%s:%d\n", note.getFirst(), note.getSecond()); + + System.out.printf("%s %s\n", name.getFirst(), name.getSecond()); + + System.out.printf("%d %d\n", tel.getFirst(), tel.getSecond()); + } +} diff --git a/solutions/src/main/java/pr2/generics/number_pair/NumberPair.java b/solutions/src/main/java/pr2/generics/number_pair/NumberPair.java new file mode 100644 index 0000000..4819db7 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/number_pair/NumberPair.java @@ -0,0 +1,8 @@ +package pr2.generics.number_pair; + +public class NumberPair extends Pair { + + public NumberPair(T first, T second) { + super(first, second); + } +} diff --git a/solutions/src/main/java/pr2/generics/number_pair/Pair.java b/solutions/src/main/java/pr2/generics/number_pair/Pair.java new file mode 100644 index 0000000..63d841e --- /dev/null +++ b/solutions/src/main/java/pr2/generics/number_pair/Pair.java @@ -0,0 +1,20 @@ +package pr2.generics.number_pair; + +public class Pair { + + private final T first; + private final V second; + + public Pair(T first, V second) { + this.first = first; + this.second = second; + } + + public T getFirst() { + return first; + } + + public V getSecond() { + return second; + } +} diff --git a/solutions/src/main/java/pr2/generics/pair/Main.java b/solutions/src/main/java/pr2/generics/pair/Main.java new file mode 100644 index 0000000..2df11ce --- /dev/null +++ b/solutions/src/main/java/pr2/generics/pair/Main.java @@ -0,0 +1,17 @@ +package pr2.generics.pair; + +public class Main { + public static void main(String[] args) { + var note1 = new Pair("Peter", 1); + var note2 = new Pair("Frank", 3); + var note3 = new Pair("Sabine", 1); + + var name = new Pair("Peter", "Meier"); + + System.out.printf("%s:%d\n", note1.getFirst(), note1.getSecond()); + System.out.printf("%s:%d\n", note2.getFirst(), note1.getSecond()); + System.out.printf("%s:%d\n", note3.getFirst(), note1.getSecond()); + + System.out.printf("%s %s\n", name.getFirst(), name.getSecond()); + } +} diff --git a/solutions/src/main/java/pr2/generics/pair/Pair.java b/solutions/src/main/java/pr2/generics/pair/Pair.java new file mode 100644 index 0000000..8afe59a --- /dev/null +++ b/solutions/src/main/java/pr2/generics/pair/Pair.java @@ -0,0 +1,20 @@ +package pr2.generics.pair; + +public class Pair { + + private final T first; + private final V second; + + public Pair(T first, V second) { + this.first = first; + this.second = second; + } + + public T getFirst() { + return first; + } + + public V getSecond() { + return second; + } +} diff --git a/solutions/src/main/java/pr2/generics/pairlist/Main.java b/solutions/src/main/java/pr2/generics/pairlist/Main.java new file mode 100644 index 0000000..d414e41 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/pairlist/Main.java @@ -0,0 +1,19 @@ +package pr2.generics.pairlist; + +public class Main { + public static void main(String[] args) { + var note1 = new Pair("Peter", 1); + var note2 = new Pair("Frank", 3); + var note3 = new Pair("Sabine", 1); + + var pl = new PairList(3); + pl.add(note1); + pl.add(note2); + pl.add(note3); + + for (int i = 0; i < 3; i++) { + System.out.printf("%s:%d\n", pl.get(i).getFirst(), + pl.get(i).getSecond()); + } + } +} diff --git a/solutions/src/main/java/pr2/generics/pairlist/Pair.java b/solutions/src/main/java/pr2/generics/pairlist/Pair.java new file mode 100644 index 0000000..3fbbfdf --- /dev/null +++ b/solutions/src/main/java/pr2/generics/pairlist/Pair.java @@ -0,0 +1,20 @@ +package pr2.generics.pairlist; + +public class Pair { + + private final T first; + private final V second; + + public Pair(T first, V second) { + this.first = first; + this.second = second; + } + + public T getFirst() { + return first; + } + + public V getSecond() { + return second; + } +} diff --git a/solutions/src/main/java/pr2/generics/pairlist/PairList.java b/solutions/src/main/java/pr2/generics/pairlist/PairList.java new file mode 100644 index 0000000..b4299b6 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/pairlist/PairList.java @@ -0,0 +1,20 @@ +package pr2.generics.pairlist; + +public class PairList { + + protected final Pair[] elements; + protected int pos; + + @SuppressWarnings("unchecked") + public PairList(int size) { + elements = (Pair[]) new Pair[size]; + } + + public void add(Pair element) { + elements[pos++] = element; + } + + public Pair get(int index) { + return elements[index]; + } +} diff --git a/solutions/src/main/java/pr2/generics/printer/CollectionPrinter.java b/solutions/src/main/java/pr2/generics/printer/CollectionPrinter.java new file mode 100644 index 0000000..4c895ab --- /dev/null +++ b/solutions/src/main/java/pr2/generics/printer/CollectionPrinter.java @@ -0,0 +1,11 @@ +package pr2.generics.printer; + +import java.util.Collection; + +public class CollectionPrinter { + public static void print(Collection collection) { + for (Object object : collection) { + System.out.println(object); + } + } +} diff --git a/solutions/src/main/java/pr2/generics/printer/Main.java b/solutions/src/main/java/pr2/generics/printer/Main.java new file mode 100644 index 0000000..4f162d5 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/printer/Main.java @@ -0,0 +1,23 @@ +package pr2.generics.printer; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Main { + public static void main(String[] args) { + List ls = new ArrayList<>(); + List li = new ArrayList<>(); + ls.add("PR2"); + ls.add("ist"); + ls.add("cool"); + Set s = new HashSet<>(ls); + li.add(23); + li.add(42); + + CollectionPrinter.print(ls); + CollectionPrinter.print(li); + CollectionPrinter.print(s); + } +} diff --git a/solutions/src/main/java/pr2/generics/queue/Queue.java b/solutions/src/main/java/pr2/generics/queue/Queue.java new file mode 100644 index 0000000..4a88180 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/queue/Queue.java @@ -0,0 +1,39 @@ +package pr2.generics.queue; + +public class Queue { + + private final T[] elements; + private int pos = 0; + private int pos2 = 0; + + @SuppressWarnings("unchecked") + public Queue(int size) { + elements = (T[]) new Object[size]; + } + + public void offer(T element) { + elements[pos] = element; + pos++; + pos = pos % elements.length; + } + + public T poll() { + T element = elements[pos2]; + elements[pos2] = null; + pos2++; + pos2 = pos2 % elements.length; + return element; + } + + public void addAll(Queue other) { + for (T t : other.elements) { + offer(t); + } + } + + public void copyInto(Queue other) { + for (T t : elements) { + other.offer(t); + } + } +} diff --git a/solutions/src/main/java/pr2/generics/same_pair/Main.java b/solutions/src/main/java/pr2/generics/same_pair/Main.java new file mode 100644 index 0000000..0b85368 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/same_pair/Main.java @@ -0,0 +1,15 @@ +package pr2.generics.same_pair; + +public class Main { + public static void main(String[] args) { + var note = new Pair("Peter", 1); + var name = new SamePair("Peter", "Meier"); + var tel = new SamePair(621, 2009992); + + System.out.printf("%s:%d\n", note.getFirst(), note.getSecond()); + + System.out.printf("%s %s\n", name.getFirst(), name.getSecond()); + + System.out.printf("%d %d\n", tel.getFirst(), tel.getSecond()); + } +} diff --git a/solutions/src/main/java/pr2/generics/same_pair/Pair.java b/solutions/src/main/java/pr2/generics/same_pair/Pair.java new file mode 100644 index 0000000..587225a --- /dev/null +++ b/solutions/src/main/java/pr2/generics/same_pair/Pair.java @@ -0,0 +1,20 @@ +package pr2.generics.same_pair; + +public class Pair { + + private final T first; + private final V second; + + public Pair(T first, V second) { + this.first = first; + this.second = second; + } + + public T getFirst() { + return first; + } + + public V getSecond() { + return second; + } +} diff --git a/solutions/src/main/java/pr2/generics/same_pair/SamePair.java b/solutions/src/main/java/pr2/generics/same_pair/SamePair.java new file mode 100644 index 0000000..5ce5c81 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/same_pair/SamePair.java @@ -0,0 +1,8 @@ +package pr2.generics.same_pair; + +public class SamePair extends Pair { + + public SamePair(T first, T second) { + super(first, second); + } +} diff --git a/solutions/src/main/java/pr2/generics/super_extends/Liste.java b/solutions/src/main/java/pr2/generics/super_extends/Liste.java new file mode 100644 index 0000000..26cce2b --- /dev/null +++ b/solutions/src/main/java/pr2/generics/super_extends/Liste.java @@ -0,0 +1,108 @@ +package pr2.generics.super_extends; + +/** + * Eine einfache, verkettete Liste. + * + * @param Typ der gespeicherten Objekte + */ +public class Liste { + + /** + * Referenz auf den ersten Knoten. + */ + private ListeNode first; + + /** + * Referenz auf den aktuellen Knoten. + */ + private ListeNode current; + + /** + * Fügt ein neues Element an das Ende der Liste an. + * + * @param data das Element + */ + public void add(T data) { + + ListeNode nextNode = new ListeNode<>(data); + + if (current == null) { + // Liste komplett leer + first = nextNode; + current = nextNode; + } + else { + current.next = nextNode; + current = nextNode; + } + } + + /** + * Liest das Element an der gegebenen Position. + * + * @param index Index, beginnend bei 0. + * @return Das Element oder {@code null}, wenn es nicht gefunden wurde. + */ + public T get(int index) { + int count = 0; + ListeNode node = first; + + while ((node != null) && (count < index)) { + node = node.next; + count++; + } + + if ((count == index) && (node != null)) { + return node.data; + } + else { + // index does not exist + return null; + } + } + + /** + * Löscht die Liste und entfernt alle Elemente. + */ + public void clear() { + first = null; + current = null; + } + + /** + * Liefert die Anzahl der Elemente der Liste zurück. + * + * @return die Anzahl der Elemente. + */ + public int size() { + int count = 0; + ListeNode node = first; + + while (node != null) { + node = node.next; + count++; + } + + return count; + } + + /** + * Kopiert alle Elemente dieser Liste in die andere Liste. + * + * @param other die andere Liste. + */ + public void copyInto(Liste other) { + for (int i = 0; i < size(); i++) { + other.add(get(i)); + } + } + + /** + * Füllt diese Liste mit dem Inhalt der übergebenen Liste. + * + * @param other die andere Liste. + */ + public void fillFrom(Liste other) { + other.copyInto(this); + } +} diff --git a/solutions/src/main/java/pr2/generics/super_extends/ListeNode.java b/solutions/src/main/java/pr2/generics/super_extends/ListeNode.java new file mode 100644 index 0000000..487f1b1 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/super_extends/ListeNode.java @@ -0,0 +1,28 @@ +package pr2.generics.super_extends; + +/** + * Interne Repräsentation der Knoten in der Liste. + * + * @param Typ der gespeicherten Daten. + */ +class ListeNode { + + /** + * Daten. + */ + T data; + + /** + * Referenz auf den nächsten Knoten. + */ + ListeNode next; + + /** + * Legt einen neuen Knoten an. + * + * @param data daten, die gespeichert werden + */ + ListeNode(T data) { + this.data = data; + } +} \ No newline at end of file diff --git a/solutions/src/main/java/pr2/generics/wildcards/ListHelper.java b/solutions/src/main/java/pr2/generics/wildcards/ListHelper.java new file mode 100644 index 0000000..0a062e8 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/wildcards/ListHelper.java @@ -0,0 +1,37 @@ +package pr2.generics.wildcards; + +/** + * Klasse zum Ausdrucken von Listen. + */ +public class ListHelper { + + /** + * Druckt alle Elemente der Liste auf der Konsole aus. + * + * @param liste Die zu druckende Liste. + */ + @SuppressWarnings("PMD.LooseCoupling") + public static void printList(SimpleList liste) { + for (Object o : liste) { + System.out.println(o); + } + } + + /** + * Summiert die Elemente der Liste. Deswegen können nur Listen übergeben + * werden, deren Elemente mindestens vom Typ {@code Number} sind. + * + * @param liste Die Liste, deren Elemente summiert werden sollen. + * @return das Ergebnis + */ + @SuppressWarnings("PMD.LooseCoupling") + public static double sumList(SimpleList liste) { + double sum = 0; + + for (Number number : liste) { + sum += number.doubleValue(); + } + + return sum; + } +} diff --git a/solutions/src/main/java/pr2/generics/wildcards/Main.java b/solutions/src/main/java/pr2/generics/wildcards/Main.java new file mode 100644 index 0000000..4e31e58 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/wildcards/Main.java @@ -0,0 +1,41 @@ +package pr2.generics.wildcards; + +/** + * Ausgabe der Liste. + */ +public final class Main { + + /** + * Constructor. + */ + private Main() { + // keine Instanzen + } + + /** + * Haupt-Methode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + @SuppressWarnings("PMD.LooseCoupling") + SimpleList l1 = new SimpleList<>(); + l1.add("Dies"); + l1.add("ist"); + l1.add("ein"); + l1.add("Test"); + l1.add("."); + + @SuppressWarnings("PMD.LooseCoupling") + SimpleList l2 = new SimpleList<>(); + l2.add(1); + l2.add(2); + l2.add(3); + l2.add(4); + l2.add(5); + + ListHelper.printList(l1); + ListHelper.printList(l2); + System.out.println(ListHelper.sumList(l2)); + } +} diff --git a/solutions/src/main/java/pr2/generics/wildcards/SimpleList.java b/solutions/src/main/java/pr2/generics/wildcards/SimpleList.java new file mode 100644 index 0000000..b4241c1 --- /dev/null +++ b/solutions/src/main/java/pr2/generics/wildcards/SimpleList.java @@ -0,0 +1,12 @@ +package pr2.generics.wildcards; + +import java.util.ArrayList; + +/** + * Listenklasse. + * + * @param Typ, der in der Liste gespeichert wird. + */ +public class SimpleList extends ArrayList { + // nothing here +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakt_form/Form.java b/solutions/src/main/java/pr2/interfaces/abstrakt_form/Form.java new file mode 100644 index 0000000..c955bac --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakt_form/Form.java @@ -0,0 +1,16 @@ +package pr2.interfaces.abstrakt_form; + +public abstract class Form { + + protected double x; + protected double y; + + public Form(double x, double y) { + this.x = x; + this.y = y; + } + + public abstract double flaeche(); + + public abstract double umfang(); +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Dreieck.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Dreieck.java new file mode 100644 index 0000000..a11edee --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Dreieck.java @@ -0,0 +1,39 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Ein Dreieck. + */ +public class Dreieck extends Figur { + + /** + * Grundseite des Dreiecks. + */ + private final double grundseite; + + /** + * Höhe. + */ + private final double hoehe; + + /** + * Erzeugt ein neues Dreieck. + * + * @param grundseite Grundseite. + * @param hoehe Höhe. + */ + public Dreieck(double grundseite, double hoehe) { + super(); + this.grundseite = grundseite; + this.hoehe = hoehe; + } + + /** + * Berechnet die Fläche. + * + * @return die Fläche. + */ + @Override + public double flaeche() { + return grundseite * hoehe / 2; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Figur.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Figur.java new file mode 100644 index 0000000..a0351f2 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Figur.java @@ -0,0 +1,14 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Basisklasse für geometrische Figuren. + */ +public abstract class Figur { + + /** + * Berechnet die Fläche einer geometrischen Figur. + * + * @return die Fläche. + */ + public abstract double flaeche(); +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Geometer.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Geometer.java new file mode 100644 index 0000000..3257c45 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Geometer.java @@ -0,0 +1,43 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Flächenberechnung. + */ +public final class Geometer { + + /** + * Keine Instanzen. + */ + private Geometer() { + // keine Objekte + } + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente + */ + public static void main(String[] args) { + Figur[] figuren = new Figur[10]; + + figuren[0] = new Kreis(10.0); + figuren[1] = new Kreis(5.5); + figuren[2] = new Kreis(3.3); + figuren[3] = new Kreis(7.2); + figuren[4] = new Kreis(8.0); + + figuren[5] = new Dreieck(4.0, 3.0); + figuren[6] = new Dreieck(2.0, 1.0); + figuren[7] = new Dreieck(5.0, 8.0); + figuren[8] = new Dreieck(2.0, 7.2); + figuren[9] = new Dreieck(14.0, 3.8); + + double gesamtflaeche = 0.0; + + for (Figur figur : figuren) { + gesamtflaeche += figur.flaeche(); + } + + System.out.printf("Die Fläche beträgt: %.2f", gesamtflaeche); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Kreis.java b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Kreis.java new file mode 100644 index 0000000..86bf749 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/abstrakte_klassen_s/Kreis.java @@ -0,0 +1,32 @@ +package pr2.interfaces.abstrakte_klassen_s; + +/** + * Ein Kreis. + */ +public class Kreis extends Figur { + + /** + * Radius des Kreises. + */ + private final double radius; + + /** + * Legt einen neuen Kreis an. + * + * @param radius Radius des Kreises. + */ + public Kreis(double radius) { + super(); + this.radius = radius; + } + + /** + * Berechnet die Fläche. + * + * @return die Fläche. + */ + @Override + public double flaeche() { + return Math.PI * radius * radius; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/comparable_student/Student.java b/solutions/src/main/java/pr2/interfaces/comparable_student/Student.java new file mode 100644 index 0000000..cf96d2f --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/comparable_student/Student.java @@ -0,0 +1,42 @@ +package pr2.interfaces.comparable_student; + +public class Student implements Comparable { + + private final String vorname; + private final String nachname; + private final int matrikelNr; + + public Student(String vorname, String nachname, + int matrikelNr) { + this.vorname = vorname; + this.nachname = nachname; + this.matrikelNr = matrikelNr; + } + + @Override + public String toString() { + return String.format("%s, %s (%d)", nachname, vorname, + matrikelNr); + } + + @Override + public int compareTo(Object o) { + + Student other = (Student) o; + + if (nachname.compareTo(other.nachname) == 0) { + if (vorname.compareTo(other.vorname) == 0) { + if (matrikelNr == other.matrikelNr) { + return 0; + } + else { + return (matrikelNr > other.matrikelNr) ? 1 : -1; + } + } + + return vorname.compareTo(other.vorname); + } + + return nachname.compareTo(other.nachname); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/api/AnalogController.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/AnalogController.java new file mode 100644 index 0000000..5cea5ce --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/AnalogController.java @@ -0,0 +1,44 @@ +package pr2.interfaces.interfaces_s.api; + +import java.awt.Point; + +/** + * Analoger Joystick. + */ +public interface AnalogController { + + /** + * Nach oben bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void up(double percentage); + + /** + * Nach unten bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void down(double percentage); + + /** + * Nach links bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void left(double percentage); + + /** + * Nach rechts bewegen. + * + * @param percentage Auslenkung in Prozent (zwischen 0 - 1) + */ + void right(double percentage); + + /** + * Liefert die aktuelle Position zurück. + * + * @return Die Position. + */ + Point getPosition(); +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/api/DigitalController.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/DigitalController.java new file mode 100644 index 0000000..ec760b9 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/api/DigitalController.java @@ -0,0 +1,36 @@ +package pr2.interfaces.interfaces_s.api; + +import java.awt.Point; + +/** + * Ein digitaler Joystick. + */ +public interface DigitalController { + + /** + * Nach oben bewegen. + */ + void up(); + + /** + * Nach unten bewegen. + */ + void down(); + + /** + * Nach links bewegen. + */ + void left(); + + /** + * Nach rechts bewegen. + */ + void right(); + + /** + * Liefert die aktuelle Position zurück. + * + * @return Die Position. + */ + Point getPosition(); +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/AnalogControllerImpl.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/AnalogControllerImpl.java new file mode 100644 index 0000000..e6241ee --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/AnalogControllerImpl.java @@ -0,0 +1,61 @@ +package pr2.interfaces.interfaces_s.impl; + +import pr2.interfaces.interfaces_s.api.AnalogController; + +import java.awt.Point; + +/** + * Analoger Joystick. + */ +public class AnalogControllerImpl implements AnalogController { + + /** + * Auslenkung in X-Richtung. + */ + private double deltaX; + + /** + * Auslenkung in Y-Richtung. + */ + private double deltaY; + + /** + * @see AnalogController#up(double) + */ + @Override + public void up(double percentage) { + deltaY -= percentage; + } + + /** + * @see AnalogController#down(double) + */ + @Override + public void down(double percentage) { + deltaY += percentage; + } + + /** + * @see AnalogController#left(double) + */ + @Override + public void left(double percentage) { + deltaX -= percentage; + } + + /** + * @see AnalogController#right(double) + */ + @Override + public void right(double percentage) { + deltaX += percentage; + } + + /** + * @see AnalogController#getPosition() + */ + @Override + public Point getPosition() { + return new Point((int) deltaX, (int) deltaY); + } +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DigitalControllerImpl.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DigitalControllerImpl.java new file mode 100644 index 0000000..2007280 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DigitalControllerImpl.java @@ -0,0 +1,55 @@ +package pr2.interfaces.interfaces_s.impl; + +import pr2.interfaces.interfaces_s.api.DigitalController; + +import java.awt.Point; + +/** + * Implementierung eines digitalen Joysticks. + */ +public class DigitalControllerImpl implements DigitalController { + + private final Point position = new Point(0, 0); + + /** + * @see DigitalController#up() + */ + @Override + public void up() { + position.translate(0, -1); + } + + /** + * @see DigitalController#down() + */ + @Override + public void down() { + position.translate(0, 1); + } + + /** + * @see DigitalController#left() + */ + @Override + public void left() { + position.translate(-1, 0); + } + + /** + * @see DigitalController#right() + */ + @Override + public void right() { + position.translate(1, 0); + } + + /** + * @see DigitalController#getPosition() + */ + @Override + public Point getPosition() { + return (Point) position.clone(); + } + + +} diff --git a/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DualShock4.java b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DualShock4.java new file mode 100644 index 0000000..35c2b8f --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/interfaces_s/impl/DualShock4.java @@ -0,0 +1,95 @@ +package pr2.interfaces.interfaces_s.impl; + +import pr2.interfaces.interfaces_s.api.AnalogController; +import pr2.interfaces.interfaces_s.api.DigitalController; + +import java.awt.Point; + +/** + * Linke Seite eines DualShock 4 Controllers. + */ +public class DualShock4 implements AnalogController, DigitalController { + + private final AnalogController analogStick = new AnalogControllerImpl(); + + private final DigitalController digitalStick = new DigitalControllerImpl(); + + /** + * @see DigitalController#up() + */ + @Override + public void up() { + digitalStick.up(); + } + + /** + * @see DigitalController#down() + */ + @Override + public void down() { + digitalStick.down(); + } + + /** + * @see DigitalController#left() + */ + @Override + public void left() { + digitalStick.left(); + } + + /** + * @see DigitalController#right() + */ + @Override + public void right() { + digitalStick.right(); + } + + /** + * @see AnalogController#up(double) + */ + @Override + public void up(double percentage) { + analogStick.up(percentage); + } + + /** + * @see AnalogController#down(double) + */ + @Override + public void down(double percentage) { + analogStick.down(percentage); + } + + /** + * @see AnalogController#left(double) + */ + @Override + public void left(double percentage) { + analogStick.left(percentage); + } + + /** + * @see AnalogController#right(double) + */ + @Override + public void right(double percentage) { + analogStick.right(percentage); + } + + /** + * @see AnalogController#getPosition() + */ + @Override + public Point getPosition() { + Point resultAnalog = analogStick.getPosition(); + Point resultDigital = digitalStick.getPosition(); + Point result = new Point(); + + result.x = resultAnalog.x + resultDigital.x; + result.y = resultAnalog.y + resultDigital.y; + + return result; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/stack/Stack.java b/solutions/src/main/java/pr2/interfaces/stack/Stack.java new file mode 100644 index 0000000..f9e4e14 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/stack/Stack.java @@ -0,0 +1,12 @@ +package pr2.interfaces.stack; + +public interface Stack { + + void push(Object o); + + Object pop(); + + Object peek(); + + int size(); +} diff --git a/solutions/src/main/java/pr2/interfaces/stack/StackImpl.java b/solutions/src/main/java/pr2/interfaces/stack/StackImpl.java new file mode 100644 index 0000000..a418c3d --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/stack/StackImpl.java @@ -0,0 +1,43 @@ +package pr2.interfaces.stack; + +public class StackImpl implements Stack { + + private final Object[] puffer; + private int pos = -1; + + public StackImpl(int size) { + puffer = new Object[size]; + } + + @Override + public void push(Object o) { + if (pos < puffer.length - 1) { + puffer[++pos] = o; + } + } + + @Override + public Object pop() { + if (pos >= 0) { + return puffer[pos--]; + } + else { + return null; + } + } + + @Override + public Object peek() { + if (pos >= 0) { + return puffer[pos]; + } + else { + return null; + } + } + + @Override + public int size() { + return pos + 1; + } +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/Translator.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/Translator.java new file mode 100644 index 0000000..a9a46c6 --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/Translator.java @@ -0,0 +1,37 @@ +package pr2.interfaces.uebersetzer; + +public class Translator { + + public static void main(String[] args) { + if (args.length != 2) { + System.err.println("Bitte geben Sie genau zwei " + + "Optionen an: Zielsprache und zu " + + "übersetzendes Wort"); + System.exit(1); + } + + String sprache = args[0].toLowerCase(); + String wort = args[1]; + + Uebersetzer uebersetzer = null; + + if ("englisch".equals(sprache)) { + uebersetzer = new UebersetzerDeutschEnglisch(); + } else if ("spanisch".equals(sprache)) { + uebersetzer = new UebersetzerDeutschSpanisch(); + } else { + System.out.println("Unbekannte Sprache"); + System.exit(1); + } + + String uebersetzung = uebersetzer.uebersetze(wort); + + if (uebersetzung != null) { + System.out.printf("Übersetzung: deutsch -> " + + "%s%n%s -> %s%n", + sprache, wort, uebersetzung); + } else { + System.out.printf("Unbekanntes Wort: %s%n", wort); + } + } +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/Uebersetzer.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/Uebersetzer.java new file mode 100644 index 0000000..50cf30d --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/Uebersetzer.java @@ -0,0 +1,13 @@ +package pr2.interfaces.uebersetzer; + +public interface Uebersetzer { + + /** + * Übersetzt den gegebeben String. + * + * @param string String, der übersetzt werden soll + * @return die Übersetzung oder {@literal null}, wenn das Wort nicht + * bekannt ist + */ + public String uebersetze(String string); +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschEnglisch.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschEnglisch.java new file mode 100644 index 0000000..fc1d14b --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschEnglisch.java @@ -0,0 +1,16 @@ +package pr2.interfaces.uebersetzer; + +public class UebersetzerDeutschEnglisch implements Uebersetzer { + + @Override + public String uebersetze(String string) { + + return switch (string) { + case "gehen" -> "go"; + case "schalfen" -> "sleep"; + case "tanzen" -> "dance"; + default -> null; + }; + + } +} diff --git a/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschSpanisch.java b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschSpanisch.java new file mode 100644 index 0000000..9c9c7cc --- /dev/null +++ b/solutions/src/main/java/pr2/interfaces/uebersetzer/UebersetzerDeutschSpanisch.java @@ -0,0 +1,16 @@ +package pr2.interfaces.uebersetzer; + +public class UebersetzerDeutschSpanisch implements Uebersetzer { + + @Override + public String uebersetze(String string) { + + return switch (string) { + case "gehen" -> "ir"; + case "schalfen" -> "dormir"; + case "tanzen" -> "bailar"; + default -> null; + }; + + } +} diff --git a/solutions/src/main/java/pr2/io/buffered_reader/LineNumberPrinter.java b/solutions/src/main/java/pr2/io/buffered_reader/LineNumberPrinter.java new file mode 100644 index 0000000..3b255c2 --- /dev/null +++ b/solutions/src/main/java/pr2/io/buffered_reader/LineNumberPrinter.java @@ -0,0 +1,36 @@ +package pr2.io.buffered_reader; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +/** + * Liest eine Textdatei und gibt den Inhalt auf der Konsole aus. + */ +public class LineNumberPrinter { + + /** + * Hauptmethode. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + + String filename = args.length == 1 + ? args[0] + : "pr2/io/reader_writer/kafka.txt"; + + try (BufferedReader r = new BufferedReader(new FileReader(filename))) { + + String line; + int count = 1; + + while ((line = r.readLine()) != null) { + System.out.printf("%3d: %s%n", count, line); + count++; + } + } catch (IOException e) { + System.err.println("IO-Problem: " + e); + } + } +} diff --git a/solutions/src/main/java/pr2/io/data_output/Board.java b/solutions/src/main/java/pr2/io/data_output/Board.java new file mode 100644 index 0000000..8433336 --- /dev/null +++ b/solutions/src/main/java/pr2/io/data_output/Board.java @@ -0,0 +1,172 @@ +package pr2.io.data_output; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +/** + * Ein Dame-Brett. + */ +public class Board { + + /** + * Belegung des Brettes. + */ + private final Color[][] brett = new Color[8][8]; + + /** + * Liest den Inhalt aus einer Datei. + * + * @param file Dateipfad. + * @return das gelesene Spielfeld + * @throws IOException IO-Probleme + */ + public static Board loadFromFile(String file) throws IOException { + + Board result = new Board(); + + DataInputStream dis = new DataInputStream(new FileInputStream(file)); + + String header = dis.readUTF(); + + if (!"Schachbrett".equals(header)) { + dis.close(); + throw new IOException("Falsches Dateiformat"); + } + + while (true) { + int x = dis.readByte(); + int y = dis.readByte(); + int ordinal = dis.readInt(); + + if (x == 0xff || y == 0xff || ordinal == -1) { + break; + } + + result.brett[x][y] = Color.values()[ordinal]; + } + + dis.close(); + + + return result; + } + + + /** + * Schreibt den Inhalt des Spielfeldes in eine Datei. + * + * @param file Dateiname. + * @throws IOException IO-Probleme + */ + public void writeToFile(String file) throws IOException { + + DataOutputStream dos = new DataOutputStream( + new FileOutputStream(file)); + + dos.writeUTF("Schachbrett"); + + for (int x = 0; x < brett.length; x++) { + for (int y = 0; y < brett[x].length; y++) { + + Color f = brett[x][y]; + + if (f != null) { + dos.writeByte(x); + dos.writeByte(y); + dos.writeInt(f.ordinal()); + } + } + } + + dos.writeByte(0xff); + dos.writeByte(0xff); + dos.writeInt(-1); + + dos.close(); + } + + /** + * Setzt einen Stein an die gegebene Koordinate. + * + * @param koordinate Koordinate in "a1"-Notation. + * @param farbe Fabe des Spielsteins. + */ + public void set(String koordinate, Color farbe) { + Tupel t = parseCoordinates(koordinate); + brett[t.x][t.y] = farbe; + } + + /** + * Wandelt textuelle Koordinaten in x- und y-Wert um. + * + * @param koordinate Koordinate als String. + * @return Koordinate als Integer-Tupel. + */ + private Tupel parseCoordinates(String koordinate) { + char buchstabe = koordinate.toLowerCase().charAt(0); + char zahl = koordinate.charAt(1); + + Tupel t = new Tupel(); + + t.y = buchstabe - 'a'; + t.x = zahl - '1'; + + if (t.x < 0 || t.x > 7) { + throw new IllegalArgumentException(); + } + + if (t.y < 0 || t.y > 7) { + throw new IllegalArgumentException(); + } + + return t; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + StringBuilder result = new StringBuilder(); + + char y = '1'; + + result.append(" "); + for (char c : "abcdefgh".toCharArray()) { + result.append(' ').append(c); + } + + result.append("\n"); + + for (Color[] figurs : brett) { + + result.append(y++); + + for (Color figur : figurs) { + if (figur != null) { + result.append(' ').append(figur); + } + else { + result.append(" "); + } + } + + result.append("\n"); + } + + return result.toString(); + } + + /** + * Tupel von zwei int-Werten. + */ + private static class Tupel { + int x; + + int y; + } +} diff --git a/solutions/src/main/java/pr2/io/data_output/Color.java b/solutions/src/main/java/pr2/io/data_output/Color.java new file mode 100644 index 0000000..63eb878 --- /dev/null +++ b/solutions/src/main/java/pr2/io/data_output/Color.java @@ -0,0 +1,30 @@ +package pr2.io.data_output; + +/** + * Farben der Spielsteine. + */ +public enum Color { + + /** + * Schwarzer Stein. + */ + BLACK, + + /** + * Weißer Stein. + */ + WHITE; + + /** + * @see java.lang.Enum#toString() + */ + @Override + public String toString() { + if (this == Color.BLACK) { + return "B"; + } + else { + return "W"; + } + } +} diff --git a/solutions/src/main/java/pr2/io/datainputoutput_1/DateReader.java b/solutions/src/main/java/pr2/io/datainputoutput_1/DateReader.java new file mode 100644 index 0000000..ca6b8b7 --- /dev/null +++ b/solutions/src/main/java/pr2/io/datainputoutput_1/DateReader.java @@ -0,0 +1,43 @@ +package pr2.io.datainputoutput_1; + +import java.io.DataInputStream; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateReader { + public static void main(String[] args) { + + DataInputStream dis = null; + + try { + DateFormat df = new SimpleDateFormat(DateWriter.FORMAT); + dis = new DataInputStream( + new FileInputStream(DateWriter.DATEINAME)); + + long time = dis.readLong(); + System.out.printf("Das Datum war: %s%n%n", + df.format(new Date(time))); + + } catch (FileNotFoundException e) { + System.err.printf("Datei %s kann nicht gelesen werden: %s%n%n", + DateWriter.DATEINAME, e.getMessage()); + System.exit(1); + } catch (IOException e) { + System.err.printf("Fehler beim Lesen der Datei %s:%s%n%n", + DateWriter.DATEINAME, e.getMessage()); + System.exit(1); + } finally { + if (dis != null) { + try { + dis.close(); + } catch (IOException e) { + // ignore + } + } + } + } +} diff --git a/solutions/src/main/java/pr2/io/datainputoutput_1/DateWriter.java b/solutions/src/main/java/pr2/io/datainputoutput_1/DateWriter.java new file mode 100644 index 0000000..bc13dcb --- /dev/null +++ b/solutions/src/main/java/pr2/io/datainputoutput_1/DateWriter.java @@ -0,0 +1,63 @@ +package pr2.io.datainputoutput_1; + +import java.io.DataOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateWriter { + + /** + * Dateiname mit den Testdaten. + */ + public static final String DATEINAME = "/tmp/test.data"; + + /** + * Datumsformat. + */ + public static final String FORMAT = "yyyy-MM-dd"; + + public static void main(String[] args) { + + if (args.length != 1) { + System.err.printf("Bitte eine Datum im Format %s angeben%n%n", + FORMAT); + System.exit(1); + } + + DataOutputStream dos = null; + + try { + DateFormat df = new SimpleDateFormat(FORMAT); + Date date = df.parse(args[0]); + dos = new DataOutputStream( + new FileOutputStream(DATEINAME)); + + dos.writeLong(date.getTime()); + } catch (ParseException e) { + System.err.printf("%s ist kein gültiges Datumsformat: %s%n%n", + args[0], FORMAT); + System.exit(1); + } catch (FileNotFoundException e) { + System.err.printf("Datei %s kann nicht geschrieben werden: %s%n%n", + DATEINAME, e.getMessage()); + System.exit(1); + } catch (IOException e) { + System.err.printf("Fehler beim Schreiben der Datei %s:%s%n%n", + DATEINAME, e.getMessage()); + System.exit(1); + } finally { + if (dos != null) { + try { + dos.close(); + } catch (IOException e) { + // ignore + } + } + } + } +} diff --git a/solutions/src/main/java/pr2/io/datainputoutput_2/DateReader.java b/solutions/src/main/java/pr2/io/datainputoutput_2/DateReader.java new file mode 100644 index 0000000..a8ed6d6 --- /dev/null +++ b/solutions/src/main/java/pr2/io/datainputoutput_2/DateReader.java @@ -0,0 +1,45 @@ +package pr2.io.datainputoutput_2; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateReader { + + public static void main(String[] args) { + + ObjectInputStream ois = null; + + try { + DateFormat df = new SimpleDateFormat(DateWriter.FORMAT); + ois = new ObjectInputStream( + new FileInputStream(DateWriter.DATEINAME)); + + Date date = (Date) ois.readObject(); + System.out.printf("Das Datum war: %s%n%n", df.format(date)); + + } catch (FileNotFoundException e) { + System.err.printf("Datei %s kann nicht gelesen werden: %s%n%n", + DateWriter.DATEINAME, e.getMessage()); + System.exit(1); + } catch (IOException e) { + System.err.printf("Fehler beim Lesen der Datei %s:%s%n%n", + DateWriter.DATEINAME, e.getMessage()); + System.exit(1); + } catch (ClassNotFoundException e) { + // Date ist Teil der Library, ist immer vorhanden + } finally { + if (ois != null) { + try { + ois.close(); + } catch (IOException e) { + // ignore + } + } + } + } +} diff --git a/solutions/src/main/java/pr2/io/datainputoutput_2/DateWriter.java b/solutions/src/main/java/pr2/io/datainputoutput_2/DateWriter.java new file mode 100644 index 0000000..a966e19 --- /dev/null +++ b/solutions/src/main/java/pr2/io/datainputoutput_2/DateWriter.java @@ -0,0 +1,63 @@ +package pr2.io.datainputoutput_2; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateWriter { + + /** + * Dateiname mit den Testdaten. + */ + public static final String DATEINAME = "/tmp/test.ser"; + + /** + * Datumsformat. + */ + public static final String FORMAT = "yyyy-MM-dd"; + + public static void main(String[] args) { + + if (args.length != 1) { + System.err.printf("Bitte eine Datum im Format %s angeben%n%n", + FORMAT); + System.exit(1); + } + + ObjectOutputStream dos = null; + + try { + DateFormat df = new SimpleDateFormat(FORMAT); + Date date = df.parse(args[0]); + dos = new ObjectOutputStream( + new FileOutputStream(DATEINAME)); + + dos.writeObject(date); + } catch (ParseException e) { + System.err.printf("%s ist kein gültiges Datumsformat: %s%n%n", + args[0], FORMAT); + System.exit(1); + } catch (FileNotFoundException e) { + System.err.printf("Datei %s kann nicht geschrieben werden: %s%n%n", + DATEINAME, e.getMessage()); + System.exit(1); + } catch (IOException e) { + System.err.printf("Fehler beim Schreiben der Datei %s:%s%n%n", + DATEINAME, e.getMessage()); + System.exit(1); + } finally { + if (dos != null) { + try { + dos.close(); + } catch (IOException e) { + // ignore + } + } + } + } +} diff --git a/solutions/src/main/java/pr2/io/datei_lesen/ReadData.java b/solutions/src/main/java/pr2/io/datei_lesen/ReadData.java new file mode 100644 index 0000000..b75a8dd --- /dev/null +++ b/solutions/src/main/java/pr2/io/datei_lesen/ReadData.java @@ -0,0 +1,33 @@ +package pr2.io.datei_lesen; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * Daten aus einer Datei lesen. + */ +public class ReadData { + + /** + * Datei. + */ + private static final String FILE = "pr2/io/datei_lesen/daten.dat"; + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + + try (InputStream is = new FileInputStream(FILE)) { + int data; + while ((data = is.read()) != -1) { + System.out.print("0x" + Integer.toHexString(data) + " "); + } + } catch (IOException e) { + System.err.println("Problem mit Datei: " + e); + } + } +} diff --git a/solutions/src/main/java/pr2/io/datei_schreiben/WriteData.java b/solutions/src/main/java/pr2/io/datei_schreiben/WriteData.java new file mode 100644 index 0000000..e4ac8e3 --- /dev/null +++ b/solutions/src/main/java/pr2/io/datei_schreiben/WriteData.java @@ -0,0 +1,29 @@ +package pr2.io.datei_schreiben; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +/** + * Daten aus einer Datei lesen. + */ +public class WriteData { + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + + String file = args[0]; + try (OutputStream os = new FileOutputStream(file)) { + + os.write(new byte[] {(byte) 0xca, (byte) 0xff, (byte) 0xfe, + (byte) 0xba, (byte) 0xbe, (byte) 0x00, (byte) 0xde, + (byte) 0xad, (byte) 0xbe, (byte) 0xef}); + } catch (IOException e) { + System.err.println("Problem mit Datei: " + e); + } + } +} diff --git a/solutions/src/main/java/pr2/io/file/FilesystemWalker.java b/solutions/src/main/java/pr2/io/file/FilesystemWalker.java new file mode 100644 index 0000000..d4ee6de --- /dev/null +++ b/solutions/src/main/java/pr2/io/file/FilesystemWalker.java @@ -0,0 +1,94 @@ +package pr2.io.file; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Stream; + +/** + * Klasse, die das Dateisystem durchläuft und Informationen ausgibt. + */ +public class FilesystemWalker { + + /** + * Haupt-Methode. + * + * @param args Kommandozeilen-Argumente. + * @throws IOException IO-Probleme + */ + public static void main(String[] args) throws IOException { + + String path = args.length > 0 ? args[0] : "."; + + Path root = Path.of(path).normalize().toAbsolutePath(); + + System.out.println("Untersuche: " + root); + System.out.println(); + + long total = walk(root); + + System.out.println(); + System.out.println("Gesamtgröße: " + niceSize(total)); + } + + /** + * Rekursive Methode, um den Baum zu durchlaufen. + * + * @param startDir Verzeichnis, bei dem gestartet werden + * soll. + * @return die Größe des Verzeichnisses. + */ + private static long walk(Path startDir) { + + long size = 0; + + if (!Files.isDirectory(startDir)) { + throw new IllegalArgumentException( + startDir + " ist kein Verzeichnis."); + } + + try (Stream fileStream = Files.list(startDir)) { + List files = fileStream.toList(); + + for (Path file : files) { + + if (Files.isDirectory(file) + && Files.isReadable(file) + && Files.isExecutable(file) + && !Files.isSymbolicLink(file) + && Files.exists(file)) { + long dirSize = walk(file); + size += dirSize; + System.out.printf("%s - %s%n", niceSize(dirSize), file); + } + else if (Files.exists(file) && !Files.isSymbolicLink(file)) { + size += Files.size(file); + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + return size; + } + + /** + * Wandelt die Größe in eine schönere Darstellung um. + * + * @param size Die Größe. + * @return Schönere Darstellung. + */ + private static String niceSize(long size) { + + if (size > 1000_000L) { + return String.format("%.1f MByte", size / 1024.0 / 1024.0); + } + else if (size > 1000L) { + return String.format("%.1f kByte", size / 1024.0); + } + else { + return String.format("%d Byte", size); + } + } +} diff --git a/solutions/src/main/java/pr2/io/filetest/FileInfo.java b/solutions/src/main/java/pr2/io/filetest/FileInfo.java new file mode 100644 index 0000000..6d3d875 --- /dev/null +++ b/solutions/src/main/java/pr2/io/filetest/FileInfo.java @@ -0,0 +1,40 @@ +package pr2.io.filetest; + +import java.nio.file.Files; +import java.io.IOException; +import java.nio.file.Path; + +public class FileInfo { + + public static void main(String[] args) throws IOException { + + if (args.length != 1) { + System.err.println( + "Bitte eine Datei oder ein Verzeichnis angeben"); + System.exit(1); + } + + Path path = Path.of(args[0]).normalize().toAbsolutePath(); + + if (Files.exists(path)) { + System.out.printf("%s existiert%n", path); + System.out.printf("%s ist %d Bytes groß%n", path, Files.size(path)); + } + + if (Files.isDirectory(path)) { + System.out.printf("%s ist ein Verzeichnis%n", path); + } + + if (Files.isRegularFile(path)) { + System.out.printf("%s ist ein normale Datei%n", path); + } + + if (Files.isReadable(path)) { + System.out.printf("%s darf gelesen werden%n", path); + } + + if (Files.isWritable(path)) { + System.out.printf("%s darf geschrieben werden%n", path); + } + } +} diff --git a/solutions/src/main/java/pr2/io/filter/UCaseReader.java b/solutions/src/main/java/pr2/io/filter/UCaseReader.java new file mode 100644 index 0000000..7cc694d --- /dev/null +++ b/solutions/src/main/java/pr2/io/filter/UCaseReader.java @@ -0,0 +1,36 @@ +package pr2.io.filter; + +import java.io.FilterReader; +import java.io.IOException; +import java.io.Reader; + +/** + * Filter-Reader, der den Inhalt in Großbuchstaben umwandelt. + */ +public class UCaseReader extends FilterReader { + + + /** + * Legt einen neuen Reader an. + * + * @param in Reader, von dem die Daten gelesen werden. + */ + public UCaseReader(Reader in) { + super(in); + } + + /** + * @see FilterReader#read(char[], int, int). + */ + @Override + public int read(char[] cbuf, int off, int len) throws IOException { + + int charsGelesen = super.read(cbuf, off, len); + + for (int i = 0; i < cbuf.length; i++) { + cbuf[i] = Character.toUpperCase(cbuf[i]); + } + + return charsGelesen; + } +} diff --git a/solutions/src/main/java/pr2/io/konsole/ConsoleToFile.java b/solutions/src/main/java/pr2/io/konsole/ConsoleToFile.java new file mode 100644 index 0000000..20e6935 --- /dev/null +++ b/solutions/src/main/java/pr2/io/konsole/ConsoleToFile.java @@ -0,0 +1,46 @@ +package pr2.io.konsole; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; + +/** + * Liest einen Text von der Console und + * schreibt ihn dann in eine Datei. Allerdings + * erfolgt das Schreiben über eine Ausgabeumleitung + * und nicht über Dateioperationen. + */ +public class ConsoleToFile { + + /** + * Logfile für Ausgaben. + */ + private static final String LOGFILE = "console.log"; + + /** + * Hauptmethode. + * + * @param args Kommandozeile-Argumente. + */ + public static void main(String[] args) { + + try (BufferedReader br = new BufferedReader( + new InputStreamReader(System.in)); + + PrintStream ps = new PrintStream(LOGFILE)) { + + System.setOut(ps); + + String line; + int count = 1; + + while ((line = br.readLine()) != null) { + System.out.println(line); + System.err.println(count++); + } + } catch (IOException ex) { + System.err.println("Dateiproblem: " + ex); + } + } +} diff --git a/solutions/src/main/java/pr2/io/linecounter/LineCounter.java b/solutions/src/main/java/pr2/io/linecounter/LineCounter.java new file mode 100644 index 0000000..3c51768 --- /dev/null +++ b/solutions/src/main/java/pr2/io/linecounter/LineCounter.java @@ -0,0 +1,29 @@ +package pr2.io.linecounter; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class LineCounter { + + public static void main(String[] args) throws IOException { + + int lines = 0; + + if (args.length != 1) { + System.err.println("Bitte eine Datei angeben"); + System.exit(1); + } + + BufferedReader br = new BufferedReader(new FileReader(args[0])); + + + while (br.readLine() != null) { + lines++; + } + + br.close(); + + System.out.printf("Datei: %s hat %d Zeilen%n", args[0], lines); + } +} diff --git a/solutions/src/main/java/pr2/io/random_access/FileSort.java b/solutions/src/main/java/pr2/io/random_access/FileSort.java new file mode 100644 index 0000000..f35241c --- /dev/null +++ b/solutions/src/main/java/pr2/io/random_access/FileSort.java @@ -0,0 +1,58 @@ +package pr2.io.random_access; + +import java.io.IOException; +import java.io.RandomAccessFile; + +/** + * Sortierung von Dateien (in place). + */ +public class FileSort { + + /** + * Sortiert die Datei von Byte-Werten per Bubble-Sort. + * + * @param filename Dateiname + * @throws IOException IO-Probleme + */ + public static void sortFile(String filename) throws IOException { + + RandomAccessFile rf = new RandomAccessFile(filename, "rw"); + + byte b1; // erstes Byte + byte b2; // zweites Byte + + long pos = 0; + boolean swap = false; + + while (true) { + // an die Position springen + rf.seek(pos); + + // zwei Bytes lesen + b1 = rf.readByte(); + b2 = rf.readByte(); + + if (b1 > b2) { + // erstes ist größer als zweites, austauschen + rf.seek(pos); + rf.write(b2); + rf.write(b1); + swap = true; + } + + pos++; + + if (pos >= rf.length() - 1) { + if (swap) { + pos = 0; + swap = false; + } + else { + break; + } + } + } + + rf.close(); + } +} diff --git a/solutions/src/main/java/pr2/io/reader_writer/ReadAndPrintFile.java b/solutions/src/main/java/pr2/io/reader_writer/ReadAndPrintFile.java new file mode 100644 index 0000000..88818a3 --- /dev/null +++ b/solutions/src/main/java/pr2/io/reader_writer/ReadAndPrintFile.java @@ -0,0 +1,34 @@ +package pr2.io.reader_writer; + +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; + +/** + * Liest eine Textdatei und gibt den Inhalt auf der Konsole aus. + */ +public class ReadAndPrintFile { + + /** + * Hauptmethode. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + + String filename = args.length == 1 + ? args[0] + : "pr2/io/reader_writer/kafka.txt"; + + try (Reader r = new FileReader(filename)) { + char[] buffer = new char[1024]; + int length; + + while ((length = r.read(buffer)) >= 0) { + System.out.print(new String(buffer, 0, length)); + } + } catch (IOException e) { + System.err.println("IO-Problem: " + e); + } + } +} diff --git a/solutions/src/main/java/pr2/io/rot13/Rot13.java b/solutions/src/main/java/pr2/io/rot13/Rot13.java new file mode 100644 index 0000000..a0a3787 --- /dev/null +++ b/solutions/src/main/java/pr2/io/rot13/Rot13.java @@ -0,0 +1,25 @@ +package pr2.io.rot13; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class Rot13 { + + public static void main(String[] args) throws IOException { + if (args.length != 1) { + System.err.println("Bitte eine Datei angeben"); + System.exit(1); + } + + BufferedReader br = new BufferedReader( + new Rot13Reader(new FileReader(args[0]))); + + String line; + while ((line = br.readLine()) != null) { + System.out.println(line); + } + + br.close(); + } +} diff --git a/solutions/src/main/java/pr2/io/rot13/Rot13Reader.java b/solutions/src/main/java/pr2/io/rot13/Rot13Reader.java new file mode 100644 index 0000000..1d87edc --- /dev/null +++ b/solutions/src/main/java/pr2/io/rot13/Rot13Reader.java @@ -0,0 +1,24 @@ +package pr2.io.rot13; + +import java.io.FilterReader; +import java.io.IOException; +import java.io.Reader; + +public class Rot13Reader extends FilterReader { + + public Rot13Reader(Reader in) { + super(in); + } + + @Override + public int read(char[] cbuf, int off, int len) throws IOException { + + int charsGelesen = super.read(cbuf, off, len); + + for (int i = off; i < charsGelesen; i++) { + cbuf[i] = cbuf[i] == '\n' ? '\n' : (char) (cbuf[i] + 13); + } + + return charsGelesen; + } +} diff --git a/solutions/src/main/java/pr2/io/scrambler/Scrambler.java b/solutions/src/main/java/pr2/io/scrambler/Scrambler.java new file mode 100644 index 0000000..f045627 --- /dev/null +++ b/solutions/src/main/java/pr2/io/scrambler/Scrambler.java @@ -0,0 +1,38 @@ +package pr2.io.scrambler; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + +public class Scrambler { + + public static void main(String[] args) throws IOException { + if (args.length != 1) { + System.err.println("Bitte eine Datei angeben"); + System.exit(1); + } + + FileInputStream fis; + + try { + fis = new FileInputStream(args[0]); + } catch (FileNotFoundException e) { + System.err.printf("Datei nicht gefunden: %s%n", args[0]); + System.exit(1); + return; // never reached + } + + int input; + int count = 0; + + while ((input = fis.read()) != -1) { + byte b = (byte) input; + + if (count++ % 2 == 0) { + System.out.write(b); + } + } + + fis.close(); + } +} diff --git a/solutions/src/main/java/pr2/io/serialisierung/Board.java b/solutions/src/main/java/pr2/io/serialisierung/Board.java new file mode 100644 index 0000000..de5e085 --- /dev/null +++ b/solutions/src/main/java/pr2/io/serialisierung/Board.java @@ -0,0 +1,139 @@ +package pr2.io.serialisierung; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +/** + * Ein Dame-Brett. + */ +public class Board implements Serializable { + + /** + * Belegung des Brettes. + */ + private final Color[][] brett = new Color[8][8]; + + /** + * Liest den Inhalt aus einer Datei. + * + * @param file Dateipfad. + * @return das gelesene Spielfeld + * @throws IOException IO-Probleme + */ + public static Board loadFromFile(String file) throws IOException { + + ObjectInputStream ois = + new ObjectInputStream(new FileInputStream(file)); + + Board result; + + try { + result = (Board) ois.readObject(); + ois.close(); + } catch (ClassNotFoundException e) { + ois.close(); + throw new IOException("Serialization: Class not found", e); + } + + return result; + } + + /** + * Schreibt den Inhalt des Spielfeldes in eine Datei. + * + * @param file Dateiname. + * @throws IOException IO-Probleme + */ + public void writeToFile(String file) throws IOException { + ObjectOutputStream oos = + new ObjectOutputStream(new FileOutputStream(file)); + oos.writeObject(this); + oos.close(); + } + + /** + * Setzt einen Stein an die gegebene Koordinate. + * + * @param koordinate Koordinate in "a1"-Notation. + * @param farbe Fabe des Spielsteins. + */ + public void set(String koordinate, Color farbe) { + Tupel t = parseCoordinates(koordinate); + brett[t.x][t.y] = farbe; + } + + /** + * Wandelt textuelle Koordinaten in x- und y-Wert um. + * + * @param koordinate Koordinate als String. + * @return Koordinate als Integer-Tupel. + */ + private Tupel parseCoordinates(String koordinate) { + char buchstabe = koordinate.toLowerCase().charAt(0); + char zahl = koordinate.charAt(1); + + Tupel t = new Tupel(); + + t.y = buchstabe - 'a'; + t.x = zahl - '1'; + + if (t.x < 0 || t.x > 7) { + throw new IllegalArgumentException(); + } + + if (t.y < 0 || t.y > 7) { + throw new IllegalArgumentException(); + } + + return t; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + StringBuilder result = new StringBuilder(); + + char y = '1'; + + result.append(" "); + for (char c : "abcdefgh".toCharArray()) { + result.append(' ').append(c); + } + + result.append("\n"); + + for (Color[] figurs : brett) { + + result.append(y++); + + for (Color figur : figurs) { + if (figur != null) { + result.append(' ').append(figur); + } + else { + result.append(" "); + } + } + + result.append("\n"); + } + + return result.toString(); + } + + /** + * Tupel von zwei int-Werten. + */ + private static class Tupel { + int x; + + int y; + } +} diff --git a/solutions/src/main/java/pr2/io/serialisierung/Color.java b/solutions/src/main/java/pr2/io/serialisierung/Color.java new file mode 100644 index 0000000..7f8f76b --- /dev/null +++ b/solutions/src/main/java/pr2/io/serialisierung/Color.java @@ -0,0 +1,30 @@ +package pr2.io.serialisierung; + +/** + * Farben der Spielsteine. + */ +public enum Color { + + /** + * Schwarzer Stein. + */ + BLACK, + + /** + * Weißer Stein. + */ + WHITE; + + /** + * @see java.lang.Enum#toString() + */ + @Override + public String toString() { + if (this == Color.BLACK) { + return "B"; + } + else { + return "W"; + } + } +} diff --git a/solutions/src/main/java/pr2/lambda/array_sorter/ReverseSort.java b/solutions/src/main/java/pr2/lambda/array_sorter/ReverseSort.java new file mode 100644 index 0000000..50ac85d --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/array_sorter/ReverseSort.java @@ -0,0 +1,28 @@ +package pr2.lambda.array_sorter; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; + +public class ReverseSort { + + public static void main(String[] args) { + Date[] dates = { + new Date(9200000000L), + new Date(9300000000L), + new Date(92100000000L), + new Date(9600000000L), + new Date(93300000000L) + }; + + Arrays.sort(dates, new Comparator() { + + @Override + public int compare(Date o1, Date o2) { + return o1.compareTo(o2) * -1; + } + }); + + System.out.println(Arrays.asList(dates)); + } +} diff --git a/solutions/src/main/java/pr2/lambda/callback/Main.java b/solutions/src/main/java/pr2/lambda/callback/Main.java new file mode 100644 index 0000000..a3ad37a --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/callback/Main.java @@ -0,0 +1,46 @@ +package pr2.lambda.callback; + +import java.util.Arrays; + +/** + * Hauptklasse. + */ +public class Main { + + private static final int[] ZAHLEN = + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20}; + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + + NumberSelector s = new NumberSelector(); + + int[] gerade; + + gerade = s.filter(new Predicate() { + @Override + public boolean accept(Integer object) { + return object % 2 == 0; + } + }, ZAHLEN); + + System.out.println(Arrays.toString(gerade)); + + int[] ungerade; + + ungerade = s.filter(new Predicate() { + @Override + public boolean accept(Integer object) { + return object % 2 != 0; + } + }, ZAHLEN); + + System.out.println(Arrays.toString(ungerade)); + + } +} diff --git a/solutions/src/main/java/pr2/lambda/callback/NumberSelector.java b/solutions/src/main/java/pr2/lambda/callback/NumberSelector.java new file mode 100644 index 0000000..bbce522 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/callback/NumberSelector.java @@ -0,0 +1,30 @@ +package pr2.lambda.callback; + +/** + * Auswählen von Zahlen mithilfe eines Callbacks. + */ +public class NumberSelector { + + /** + * Filtert die übergebenen Zahlen anhand des Prädikates. + * + * @param predicate Prädikat. + * @param numbers die zu filternden Zahlen. + * @return Das Ergebnis + */ + public int[] filter(Predicate predicate, int[] numbers) { + + int[] temp = new int[numbers.length]; + int count = 0; + + for (int i : numbers) { + if (predicate.accept(i)) { + temp[count++] = i; + } + } + + int[] result = new int[count]; + System.arraycopy(temp, 0, result, 0, count); + return result; + } +} diff --git a/solutions/src/main/java/pr2/lambda/callback/Predicate.java b/solutions/src/main/java/pr2/lambda/callback/Predicate.java new file mode 100644 index 0000000..bf3f416 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/callback/Predicate.java @@ -0,0 +1,20 @@ +package pr2.lambda.callback; + +/** + * Interface, um Entscheidung über ein Objekt zu + * treffen. + * + * @param Typ des Objekts + */ +@FunctionalInterface +public interface Predicate { + + /** + * Entscheidet, ob ein Objekt akzeptiert wird oder nicht. + * + * @param object das zu untersuchende Objekt + * @return {@code true} wenn das Objekt akzeptiert wird, + * andernfalls {@code false}. + */ + boolean accept(T object); +} diff --git a/solutions/src/main/java/pr2/lambda/comparator/SortLambda.java b/solutions/src/main/java/pr2/lambda/comparator/SortLambda.java new file mode 100644 index 0000000..9a605d8 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/comparator/SortLambda.java @@ -0,0 +1,12 @@ +package pr2.lambda.comparator; + +import java.util.Arrays; + +public class SortLambda { + + public static void main(String[] args) { + Integer[] zahlen = {23, 42, 17, 9, 1, 5, 7, 88, 35}; + Arrays.sort(zahlen, (a, b) -> b - a); + System.out.println(Arrays.toString(zahlen)); + } +} diff --git a/solutions/src/main/java/pr2/lambda/lambdas/Main.java b/solutions/src/main/java/pr2/lambda/lambdas/Main.java new file mode 100644 index 0000000..85460bc --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/lambdas/Main.java @@ -0,0 +1,31 @@ +package pr2.lambda.lambdas; + +import java.util.Arrays; + +/** + * Hauptklasse. + */ +public class Main { + + private static final int[] ZAHLEN = + {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20}; + + /** + * Hauptmethode. + * + * @param args Kommandozeileargumente. + */ + public static void main(String[] args) { + + NumberSelector s = new NumberSelector(); + + int[] gerade = s.filter((i) -> i % 2 == 0, ZAHLEN); + + System.out.println(Arrays.toString(gerade)); + + int[] ungerade = s.filter((i) -> i % 2 != 0, ZAHLEN); + + System.out.println(Arrays.toString(ungerade)); + } +} diff --git a/solutions/src/main/java/pr2/lambda/lambdas/NumberSelector.java b/solutions/src/main/java/pr2/lambda/lambdas/NumberSelector.java new file mode 100644 index 0000000..16f974b --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/lambdas/NumberSelector.java @@ -0,0 +1,30 @@ +package pr2.lambda.lambdas; + +/** + * Auswählen von Zahlen mithilfe eines Callbacks. + */ +public class NumberSelector { + + /** + * Filtert die übergebenen Zahlen anhand des Prädikates. + * + * @param predicate Prädikat. + * @param numbers die zu filternden Zahlen. + * @return Das Ergebnis + */ + public int[] filter(Predicate predicate, int[] numbers) { + + int[] temp = new int[numbers.length]; + int count = 0; + + for (int i : numbers) { + if (predicate.accept(i)) { + temp[count++] = i; + } + } + + int[] result = new int[count]; + System.arraycopy(temp, 0, result, 0, count); + return result; + } +} diff --git a/solutions/src/main/java/pr2/lambda/lambdas/Predicate.java b/solutions/src/main/java/pr2/lambda/lambdas/Predicate.java new file mode 100644 index 0000000..d8aa4ee --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/lambdas/Predicate.java @@ -0,0 +1,20 @@ +package pr2.lambda.lambdas; + +/** + * Interface, um Entscheidung über ein Objekt zu + * treffen. + * + * @param Typ des Objekts + */ +@FunctionalInterface +public interface Predicate { + + /** + * Entscheidet, ob ein Objekt akzeptiert wird oder nicht. + * + * @param object das zu untersuchende Objekt + * @return {@code true} wenn das Objekt akzeptiert wird, + * andernfalls {@code false}. + */ + boolean accept(T object); +} diff --git a/solutions/src/main/java/pr2/lambda/matrixsuche/MatrixSuche.java b/solutions/src/main/java/pr2/lambda/matrixsuche/MatrixSuche.java new file mode 100644 index 0000000..21b2d88 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/matrixsuche/MatrixSuche.java @@ -0,0 +1,39 @@ +package pr2.lambda.matrixsuche; + +public class MatrixSuche { + + public static class Position { + private final int xPos; + private final int yPos; + + public Position(int xPos, int yPos) { + this.xPos = xPos; + this.yPos = yPos; + } + + public int getxPos() { + return xPos; + } + + public int getyPos() { + return yPos; + } + + @Override + public String toString() { + return String.format("(%d, %d)", xPos, yPos); + } + } + + public static Position findEntry(int[][] matrix, int wert) { + for (int i = 0; i < matrix.length; i++) { + for (int k = 0; k < matrix[i].length; k++) { + if (matrix[i][k] == wert) { + return new Position(i, k); + } + } + } + + return null; + } +} diff --git a/solutions/src/main/java/pr2/lambda/mogrifier_1/StringFunction.java b/solutions/src/main/java/pr2/lambda/mogrifier_1/StringFunction.java new file mode 100644 index 0000000..6fca817 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/mogrifier_1/StringFunction.java @@ -0,0 +1,6 @@ +package pr2.lambda.mogrifier_1; + +@FunctionalInterface +public interface StringFunction { + String apply(String s); +} diff --git a/solutions/src/main/java/pr2/lambda/mogrifier_1/StringTransmogrifier.java b/solutions/src/main/java/pr2/lambda/mogrifier_1/StringTransmogrifier.java new file mode 100644 index 0000000..21d976a --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/mogrifier_1/StringTransmogrifier.java @@ -0,0 +1,14 @@ +package pr2.lambda.mogrifier_1; + +public class StringTransmogrifier { + + public static String[] transmogrify(String[] elements, StringFunction t) { + String[] result = new String[elements.length]; + + for (int i = 0; i < elements.length; i++) { + result[i] = t.apply(elements[i]); + } + + return result; + } +} diff --git a/solutions/src/main/java/pr2/lambda/mogrifier_2/StringFunction.java b/solutions/src/main/java/pr2/lambda/mogrifier_2/StringFunction.java new file mode 100644 index 0000000..11d9608 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/mogrifier_2/StringFunction.java @@ -0,0 +1,18 @@ +package pr2.lambda.mogrifier_2; + +@FunctionalInterface +public interface StringFunction { + static StringFunction caesar(final int shift) { + return (s) -> shiftCharacters(s, shift); + } + + static String shiftCharacters(String s, int shift) { + char[] c = s.toCharArray(); + for (int i = 0; i < c.length; i++) { + c[i] = (char) (c[i] + shift); + } + return new String(c); + } + + String apply(String s); +} diff --git a/solutions/src/main/java/pr2/lambda/mogrifier_2/StringTransmogrifier.java b/solutions/src/main/java/pr2/lambda/mogrifier_2/StringTransmogrifier.java new file mode 100644 index 0000000..79b64a4 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/mogrifier_2/StringTransmogrifier.java @@ -0,0 +1,14 @@ +package pr2.lambda.mogrifier_2; + +public class StringTransmogrifier { + + public static String[] transmogrify(String[] elements, StringFunction t) { + String[] result = new String[elements.length]; + + for (int i = 0; i < elements.length; i++) { + result[i] = t.apply(elements[i]); + } + + return result; + } +} diff --git a/solutions/src/main/java/pr2/lambda/observer/Beobachter.java b/solutions/src/main/java/pr2/lambda/observer/Beobachter.java new file mode 100644 index 0000000..98eb441 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/observer/Beobachter.java @@ -0,0 +1,5 @@ +package pr2.lambda.observer; + +public interface Beobachter { + int getValue(); +} diff --git a/solutions/src/main/java/pr2/lambda/observer/Datenhalter.java b/solutions/src/main/java/pr2/lambda/observer/Datenhalter.java new file mode 100644 index 0000000..9eb10d5 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/observer/Datenhalter.java @@ -0,0 +1,23 @@ +package pr2.lambda.observer; + +public class Datenhalter { + + private final int geheimerWert; + + public Datenhalter(int geheimerWert) { + this.geheimerWert = geheimerWert; + } + + public Beobachter getBeobachter() { + return new BeobachterImpl(); + } + + private class BeobachterImpl implements Beobachter { + + @Override + public int getValue() { + return geheimerWert; + } + + } +} diff --git a/solutions/src/main/java/pr2/lambda/observer/DatenhalterAnonym.java b/solutions/src/main/java/pr2/lambda/observer/DatenhalterAnonym.java new file mode 100644 index 0000000..b2f2d64 --- /dev/null +++ b/solutions/src/main/java/pr2/lambda/observer/DatenhalterAnonym.java @@ -0,0 +1,19 @@ +package pr2.lambda.observer; + +public class DatenhalterAnonym { + + private final int geheimerWert; + + public DatenhalterAnonym(int geheimerWert) { + this.geheimerWert = geheimerWert; + } + + public Beobachter getBeobachter() { + return new Beobachter() { + @Override + public int getValue() { + return geheimerWert; + } + }; + } +} diff --git a/solutions/src/main/java/pr2/object/clone_alien/Alien.java b/solutions/src/main/java/pr2/object/clone_alien/Alien.java new file mode 100644 index 0000000..65f7132 --- /dev/null +++ b/solutions/src/main/java/pr2/object/clone_alien/Alien.java @@ -0,0 +1,100 @@ +package pr2.object.clone_alien; + +/** + * Ein Alien. + */ +public class Alien implements Cloneable { + + /** + * Name des Aliens. + */ + private final String name; + + /** + * Raumanzug des Aliens. + */ + private Raumanzug raumanzug; + + /** + * Erzeugt ein neues Alien. + * + * @param name Name des Aliens. + * @param raumanzug Anzug. + */ + public Alien(String name, Raumanzug raumanzug) { + this.name = name; + this.raumanzug = raumanzug; + } + + /** + * Gibt den Namen des Aliens zurück. + * + * @return Name des Aliens. + */ + public String getName() { + return name; + } + + /** + * Gibt den Anzug zurück. + * + * @return der Anzug. + */ + public Raumanzug getAnzug() { + return raumanzug; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((raumanzug + == null) ? 0 : raumanzug.hashCode()); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Alien other = (Alien) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } + else if (!name.equals(other.name)) { + return false; + } + if (raumanzug == null) { + return other.raumanzug == null; + } + else { + return raumanzug.equals(other.raumanzug); + } + } + + /** + * @see java.lang.Object#clone() + */ + @Override + public Object clone() throws CloneNotSupportedException { + Alien o = (Alien) super.clone(); + o.raumanzug = (Raumanzug) raumanzug.clone(); + return o; + } +} diff --git a/solutions/src/main/java/pr2/object/clone_alien/Raumanzug.java b/solutions/src/main/java/pr2/object/clone_alien/Raumanzug.java new file mode 100644 index 0000000..b17cde6 --- /dev/null +++ b/solutions/src/main/java/pr2/object/clone_alien/Raumanzug.java @@ -0,0 +1,75 @@ +package pr2.object.clone_alien; + +/** + * Ein Raumanzug. + */ +public class Raumanzug implements Cloneable { + + /** + * Sauerstoffvorrat, der noch im Raumanzug ist. + */ + private double sauerstoffVorrat; + + /** + * Ertzeugt einen neuen Raumanzug. + */ + public Raumanzug() { + sauerstoffVorrat = Math.random(); + } + + /** + * Sauerstoffvorrat im Anzug. + * + * @return Vorrat in % (0.0-1.0) + */ + public double getSauerstoffVorrat() { + return sauerstoffVorrat; + } + + /** + * Tankt den Anzug auf. + */ + public void auftanken() { + sauerstoffVorrat = 1.0; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + long temp; + temp = Double.doubleToLongBits(sauerstoffVorrat); + result = prime * result + (int) (temp ^ (temp >>> 32)); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Raumanzug other = (Raumanzug) obj; + return Double.doubleToLongBits(sauerstoffVorrat) + == Double.doubleToLongBits(other.sauerstoffVorrat); + } + + /** + * @see java.lang.Object#clone() + */ + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/solutions/src/main/java/pr2/object/clone_person/Person.java b/solutions/src/main/java/pr2/object/clone_person/Person.java new file mode 100644 index 0000000..b95b0c9 --- /dev/null +++ b/solutions/src/main/java/pr2/object/clone_person/Person.java @@ -0,0 +1,34 @@ +package pr2.object.clone_person; + +import java.util.Date; + +public class Person implements Cloneable { + + private final String vorname = ""; + private final String nachname = ""; + private Date geburtsdatum = new Date(); + + @Override + public Object clone() { + Person clone; + try { + clone = (Person) super.clone(); + clone.geburtsdatum = (Date) geburtsdatum.clone(); + return clone; + } + catch (CloneNotSupportedException e) { + // cannot happen + return null; + } + } + + + @Override + public String toString() { + return "Person{" + + "vorname='" + vorname + '\'' + + ", nachname='" + nachname + '\'' + + ", geburtsdatum=" + geburtsdatum + + '}'; + } +} diff --git a/solutions/src/main/java/pr2/object/equals_hashcode/Ork.java b/solutions/src/main/java/pr2/object/equals_hashcode/Ork.java new file mode 100644 index 0000000..abae1a9 --- /dev/null +++ b/solutions/src/main/java/pr2/object/equals_hashcode/Ork.java @@ -0,0 +1,57 @@ +package pr2.object.equals_hashcode; + +/** + * Ork. + */ +public class Ork extends Wesen { + + /** + * Stärke der Orks. + */ + private static final int ORK_STAERKE = 17; + + /** + * Zeigt an, ob der Ork gut oder böse ist. + */ + private final boolean boese; + + /** + * Legt einen neuen Ork an. + * + * @param name Name des Orks. + * @param boese zeigt an, ob der Ork gut oder böse ist + */ + public Ork(String name, boolean boese) { + super(name, ORK_STAERKE); + this.boese = boese; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + (boese ? 1231 : 1237); + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!super.equals(obj)) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Ork other = (Ork) obj; + return boese == other.boese; + } +} diff --git a/solutions/src/main/java/pr2/object/equals_hashcode/Wesen.java b/solutions/src/main/java/pr2/object/equals_hashcode/Wesen.java new file mode 100644 index 0000000..424641c --- /dev/null +++ b/solutions/src/main/java/pr2/object/equals_hashcode/Wesen.java @@ -0,0 +1,66 @@ +package pr2.object.equals_hashcode; + +/** + * Ein Wesen in der Spielwelt. + */ +public class Wesen { + + /** + * Name des Wesens. + */ + private final String name; + + /** + * Stärke des Wesens. + */ + private final int staerke; + + /** + * Legt ein neues Wesen an. + * + * @param name Name des Wesens. + * @param staerke Stärke des Wesens. + */ + public Wesen(String name, int staerke) { + this.name = name; + this.staerke = staerke; + } + + /** + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + staerke; + return result; + } + + /** + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Wesen other = (Wesen) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } + else if (!name.equals(other.name)) { + return false; + } + return staerke == other.staerke; + } +} diff --git a/solutions/src/main/java/pr2/object/equals_person/Person.java b/solutions/src/main/java/pr2/object/equals_person/Person.java new file mode 100644 index 0000000..b45948d --- /dev/null +++ b/solutions/src/main/java/pr2/object/equals_person/Person.java @@ -0,0 +1,54 @@ +package pr2.object.equals_person; + +public class Person { + + private String vorname; + private String nachname; + private int alter; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + alter; + result = prime * result + + ((nachname == null) ? 0 : nachname.hashCode()); + result = prime * result + + ((vorname == null) ? 0 : vorname.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (this == obj) { + return true; + } + if (getClass() != obj.getClass()) { + return false; + } + + Person other = (Person) obj; + + if (alter != other.alter) { + return false; + } + + if (nachname == null) { + if (other.nachname != null) { + return false; + } + } + else if (!nachname.equals(other.nachname)) { + return false; + } + if (vorname == null) { + return other.vorname == null; + } + else { + return vorname.equals(other.vorname); + } + } +} diff --git a/solutions/src/main/java/pr2/object/tostring/Alien.java b/solutions/src/main/java/pr2/object/tostring/Alien.java new file mode 100644 index 0000000..0a18c04 --- /dev/null +++ b/solutions/src/main/java/pr2/object/tostring/Alien.java @@ -0,0 +1,56 @@ +package pr2.object.tostring; + +/** + * Ein Alien. + */ +public class Alien implements Cloneable { + + /** + * Name des Aliens. + */ + private final String name; + + /** + * Raumanzug des Aliens. + */ + private final Raumanzug raumanzug; + + /** + * Erzeugt ein neues Alien. + * + * @param name Name des Aliens. + * @param raumanzug Anzug. + */ + public Alien(String name, Raumanzug raumanzug) { + this.name = name; + this.raumanzug = raumanzug; + } + + /** + * Gibt den Namen des Aliens zurück. + * + * @return Name des Aliens. + */ + public String getName() { + return name; + } + + /** + * Gibt den Anzug zurück. + * + * @return der Anzug. + */ + public Raumanzug getAnzug() { + return raumanzug; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format( + "Ich bin ein Alien und heiße '%s'. Ich trage " + "einen %s.", + name, raumanzug); + } +} diff --git a/solutions/src/main/java/pr2/object/tostring/Ausgabe.java b/solutions/src/main/java/pr2/object/tostring/Ausgabe.java new file mode 100644 index 0000000..637f3c6 --- /dev/null +++ b/solutions/src/main/java/pr2/object/tostring/Ausgabe.java @@ -0,0 +1,24 @@ +package pr2.object.tostring; + +/** + * Ausgabe. + */ +public final class Ausgabe { + + /** + * Konstruktor. + */ + private Ausgabe() { + // keine Objekte. + } + + /** + * Einstiegspunkt in das Programm. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + Alien alien = new Alien("E.T.", new Raumanzug("Spaceman 2000")); + System.out.println(alien); + } +} diff --git a/solutions/src/main/java/pr2/object/tostring/Raumanzug.java b/solutions/src/main/java/pr2/object/tostring/Raumanzug.java new file mode 100644 index 0000000..795e95e --- /dev/null +++ b/solutions/src/main/java/pr2/object/tostring/Raumanzug.java @@ -0,0 +1,52 @@ +package pr2.object.tostring; + +/** + * Ein Raumanzug. + */ +public class Raumanzug implements Cloneable { + + /** + * Hersteller des Raumanzuges. + */ + private final String hersteller; + + /** + * Sauerstoffvorrat, der noch im Raumanzug ist. + */ + private double sauerstoffVorrat; + + /** + * Ertzeugt einen neuen Raumanzug. + * + * @param hersteller Hersteller des Anzuges. + */ + public Raumanzug(String hersteller) { + this.hersteller = hersteller; + sauerstoffVorrat = Math.random(); + } + + /** + * Sauerstoffvorrat im Anzug. + * + * @return Vorrat in % (0.0-1.0) + */ + public double getSauerstoffVorrat() { + return sauerstoffVorrat; + } + + /** + * Tankt den Anzug auf. + */ + public void auftanken() { + sauerstoffVorrat = 1.0; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("Raumanzug von %s (Füllstand %d%%)", hersteller, + (int) (sauerstoffVorrat * 100)); + } +} diff --git a/solutions/src/main/java/pr2/object/wrapper_boxsearch/BoxSearcher.java b/solutions/src/main/java/pr2/object/wrapper_boxsearch/BoxSearcher.java new file mode 100644 index 0000000..7370cda --- /dev/null +++ b/solutions/src/main/java/pr2/object/wrapper_boxsearch/BoxSearcher.java @@ -0,0 +1,18 @@ +package pr2.object.wrapper_boxsearch; + +public class BoxSearcher { + + public static void main(String[] args) { + Integer[] array = new Integer[200]; + + for (int i = 0; i < array.length; i++) { + array[i] = i; + } + + for (Integer element : array) { + boolean identisch = (element == Integer.valueOf( + element.intValue())); + System.out.printf("%d: %s%n", element, identisch); + } + } +} diff --git a/solutions/src/main/java/pr2/object/wrapper_umwandler/Umwandler.java b/solutions/src/main/java/pr2/object/wrapper_umwandler/Umwandler.java new file mode 100644 index 0000000..7499a05 --- /dev/null +++ b/solutions/src/main/java/pr2/object/wrapper_umwandler/Umwandler.java @@ -0,0 +1,47 @@ +package pr2.object.wrapper_umwandler; + +/** + * Enthält Methoden, um Integer-Zahlen umzuwandeln. + */ +public final class Umwandler { + + /** + * Konstruktor. + */ + private Umwandler() { + // keine Instanzen + } + + /** + * Wandelt eine Zahl in meherer Formate um. + * + * @param i die Zahl. + * @return String mit mehreren Formaten. + */ + public static String toString(int i) { + return "Dezimal: " + i + "\n" + "Hex : " + Integer.toHexString(i) + + "\n" + "Oktal : " + Integer.toOctalString(i) + "\n" + + "Binär : " + Integer.toBinaryString(i); + } + + /** + * Wandelt einen String (zur Basis 10) in eine Zahl um. + * + * @param s String, der umgewandelt werden soll + * @return Umgewandelte Zahl + */ + public static int fromString(String s) { + return Integer.parseInt(s); + } + + /** + * Einstiegspunkt in das Programm. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + String s = "17871"; + int i = fromString(s); + System.out.println(toString(i)); + } +} diff --git a/solutions/src/main/java/pr2/reflection/analyzer/Analyzer.java b/solutions/src/main/java/pr2/reflection/analyzer/Analyzer.java new file mode 100644 index 0000000..0606063 --- /dev/null +++ b/solutions/src/main/java/pr2/reflection/analyzer/Analyzer.java @@ -0,0 +1,33 @@ +package pr2.reflection.analyzer; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class Analyzer { + + public static void main(String[] args) { + + if (args.length != 1) { + System.err.println("Bitte einen Klassennamen angeben."); + System.exit(1); + } + + try { + Class clazz = Class.forName(args[0]); + Method[] methods = clazz.getMethods(); + Field[] fields = clazz.getFields(); + + for (Field field : fields) { + System.out.println(field); + } + + for (Method method : methods) { + System.out.println(method); + } + } + catch (ClassNotFoundException e) { + System.err.println("Klasse nicht gefunden."); + System.exit(1); + } + } +} diff --git a/solutions/src/main/java/pr2/reflection/reflector/Reflector.java b/solutions/src/main/java/pr2/reflection/reflector/Reflector.java new file mode 100644 index 0000000..35a0413 --- /dev/null +++ b/solutions/src/main/java/pr2/reflection/reflector/Reflector.java @@ -0,0 +1,21 @@ +package pr2.reflection.reflector; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class Reflector { + + public static void main(String[] args) throws ClassNotFoundException, + SecurityException, NoSuchMethodException, IllegalArgumentException, + InstantiationException, IllegalAccessException, + InvocationTargetException { + + Class clazz = Class.forName("java.util.Date"); + Constructor constructor = clazz.getConstructor(); + Object o = constructor.newInstance((Object[]) null); + Method toString = clazz.getMethod("toString"); + Object result = toString.invoke(o, (Object[]) null); + System.out.println(result); + } +} diff --git a/solutions/src/main/java/pr2/streams/chars_1/CountLetters.java b/solutions/src/main/java/pr2/streams/chars_1/CountLetters.java new file mode 100644 index 0000000..d9b86c9 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/chars_1/CountLetters.java @@ -0,0 +1,13 @@ +package pr2.streams.chars_1; + +public class CountLetters { + public static long count(String s) { + long sum; + + sum = s.chars() + .filter(Character::isLowerCase) + .count(); + + return sum; + } +} diff --git a/solutions/src/main/java/pr2/streams/chars_2/CountLetters.java b/solutions/src/main/java/pr2/streams/chars_2/CountLetters.java new file mode 100644 index 0000000..c13bdfb --- /dev/null +++ b/solutions/src/main/java/pr2/streams/chars_2/CountLetters.java @@ -0,0 +1,16 @@ +package pr2.streams.chars_2; + +import java.util.List; + +public class CountLetters { + public static long count(List liste) { + + long chars; + + chars = liste.stream() + .flatMapToInt(s -> s.chars()) + .count(); + + return chars; + } +} diff --git a/solutions/src/main/java/pr2/streams/chars_3/CountLetters.java b/solutions/src/main/java/pr2/streams/chars_3/CountLetters.java new file mode 100644 index 0000000..b2b43e0 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/chars_3/CountLetters.java @@ -0,0 +1,17 @@ +package pr2.streams.chars_3; + +import java.util.List; + +public class CountLetters { + public static long count(List liste) { + + long chars; + + chars = liste.stream() + .flatMapToInt(s -> s.chars()) + .filter(Character::isLowerCase) + .count(); + + return chars; + } +} diff --git a/solutions/src/main/java/pr2/streams/filter/FilterList.java b/solutions/src/main/java/pr2/streams/filter/FilterList.java new file mode 100644 index 0000000..99c64a7 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/filter/FilterList.java @@ -0,0 +1,17 @@ +package pr2.streams.filter; + +import java.util.List; +import java.util.stream.Collectors; + +public class FilterList { + public static List filter(List liste) { + List result; + + result = liste.stream() + .filter(s -> s.length() >= 5) + .map(String::toLowerCase) + .collect(Collectors.toList()); + + return result; + } +} diff --git a/solutions/src/main/java/pr2/streams/interne_iteration/ComputerGame.java b/solutions/src/main/java/pr2/streams/interne_iteration/ComputerGame.java new file mode 100644 index 0000000..ad9ef21 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/interne_iteration/ComputerGame.java @@ -0,0 +1,87 @@ +package pr2.streams.interne_iteration; + +/** + * Computerspiel. + */ +public class ComputerGame { + + /** + * Name. + */ + private final String name; + + /** + * Jahr. + */ + private final int year; + + /** + * Metacritic. + */ + private final int metaScore; + + /** + * Userscore. + */ + private final int userScore; + + /** + * Legt ein neues Spiel an. + * + * @param name Name des Spiels. + * @param year Jahr. + * @param metaScore Metacritic-Bewertung. + * @param userScore Nutzer-Bewertung. + */ + public ComputerGame(String name, int year, int metaScore, int userScore) { + this.name = name; + this.year = year; + this.metaScore = metaScore; + this.userScore = userScore; + } + + /** + * Name des Spiels. + * + * @return Der Name + */ + public String getName() { + return name; + } + + /** + * Jahr, in dem das Spiel erschienen ist bzw. kritisiert wurde. + * + * @return Das Erscheinungsjahr. + */ + public int getYear() { + return year; + } + + /** + * Die Metacritic-Bewertung (0-100). + * + * @return Die Bewertung. + */ + public int getMetaScore() { + return metaScore; + } + + /** + * Die Benutzerbewertung (0-100). + * + * @return Die Benutzerbewertung. + */ + public int getUserScore() { + return userScore; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("%d;%s;%s;%d", metaScore, name, userScore / 10.0, + year); + } +} diff --git a/solutions/src/main/java/pr2/streams/interne_iteration/GameDatabase.java b/solutions/src/main/java/pr2/streams/interne_iteration/GameDatabase.java new file mode 100644 index 0000000..be8483f --- /dev/null +++ b/solutions/src/main/java/pr2/streams/interne_iteration/GameDatabase.java @@ -0,0 +1,61 @@ +package pr2.streams.interne_iteration; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** + * Datenbank für die Spiele. + */ +public class GameDatabase { + + private final List games; + + /** + * Datenbank mit Spieleinfomrationen. + */ + @SuppressWarnings("deprecation") + public GameDatabase() { + games = new ArrayList<>(); + + try { + BufferedReader br = + new BufferedReader(new FileReader( + "games.txt")); + + String line; + + while ((line = br.readLine()) != null) { + String[] tokens = line.split(";"); + int metacritic = Integer.parseInt(tokens[0]); + String name = tokens[1]; + int userScore = (int) (Double.parseDouble(tokens[2]) * 10); + Date date = + new SimpleDateFormat("MMM d, yyyy", Locale.US).parse( + tokens[3]); + + games.add(new ComputerGame(name, date.getYear() + 1900, + metacritic, userScore)); + } + + br.close(); + } catch (IOException | ParseException ex) { + ex.printStackTrace(); + } + } + + /** + * Gibt die Liste der Spiele zurück. + * + * @return Liste der Spiele + */ + public List getGames() { + return new ArrayList<>(games); + } +} diff --git a/solutions/src/main/java/pr2/streams/interne_iteration/ListGames.java b/solutions/src/main/java/pr2/streams/interne_iteration/ListGames.java new file mode 100644 index 0000000..e9cce9b --- /dev/null +++ b/solutions/src/main/java/pr2/streams/interne_iteration/ListGames.java @@ -0,0 +1,39 @@ +package pr2.streams.interne_iteration; + +import java.util.stream.Stream; + +/** + * Spiele auflisten. + */ +public class ListGames { + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + GameDatabase db = new GameDatabase(); + + System.out.println("Interne Iterartion"); + System.out.println(); + Stream stream = db.getGames().stream(); + stream.forEach(g -> System.out.println(g)); + + System.out.println(); + System.out.println(); + System.out.println("Interne Iterartion mit Methodenreferenz"); + stream = db.getGames().stream(); + stream.forEach(System.out::println); + + System.out.println(); + System.out.println(); + System.out.println("Spiele aus 2012"); + stream = db.getGames().stream(); + stream.forEach(g -> { + if (g.getYear() == 2012) { + System.out.println(g); + } + }); + } +} diff --git a/solutions/src/main/java/pr2/streams/map_filter/ComputerGame.java b/solutions/src/main/java/pr2/streams/map_filter/ComputerGame.java new file mode 100644 index 0000000..c85cb86 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/map_filter/ComputerGame.java @@ -0,0 +1,88 @@ +package pr2.streams.map_filter; + +/** + * Computerspiel. + */ +public class ComputerGame { + + /** + * Name. + */ + private final String name; + + /** + * Jahr. + */ + private final int year; + + /** + * Metacritic. + */ + private final int metaScore; + + /** + * Userscore. + */ + private final int userScore; + + /** + * Legt ein neues Spiel an. + * + * @param name Name des Spiels. + * @param year Jahr. + * @param metaScore Metacritic-Bewertung. + * @param userScore Nutzer-Bewertung. + */ + public ComputerGame(String name, int year, int metaScore, int userScore) { + + this.name = name; + this.year = year; + this.metaScore = metaScore; + this.userScore = userScore; + } + + /** + * Name des Spiels. + * + * @return Der Name + */ + public String getName() { + return name; + } + + /** + * Jahr, in dem das Spiel erschienen ist bzw. kritisiert wurde. + * + * @return Das Erscheinungsjahr. + */ + public int getYear() { + return year; + } + + /** + * Die Metacritic-Bewertung (0-100). + * + * @return Die Bewertung. + */ + public int getMetaScore() { + return metaScore; + } + + /** + * Die Benutzerbewertung (0-100). + * + * @return Die Benutzerbewertung. + */ + public int getUserScore() { + return userScore; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("%d;%s;%s;%d", metaScore, name, userScore / 10.0, + year); + } +} diff --git a/solutions/src/main/java/pr2/streams/map_filter/GameDatabase.java b/solutions/src/main/java/pr2/streams/map_filter/GameDatabase.java new file mode 100644 index 0000000..863ff18 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/map_filter/GameDatabase.java @@ -0,0 +1,61 @@ +package pr2.streams.map_filter; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** + * Datenbank für die Spiele. + */ +public class GameDatabase { + + private final List games; + + /** + * Datenbank mit Spieleinfomrationen. + */ + @SuppressWarnings("deprecation") + public GameDatabase() { + games = new ArrayList<>(); + + try { + BufferedReader br = + new BufferedReader(new FileReader( + "games.txt")); + + String line; + + while ((line = br.readLine()) != null) { + String[] tokens = line.split(";"); + int metacritic = Integer.parseInt(tokens[0]); + String name = tokens[1]; + int userScore = (int) (Double.parseDouble(tokens[2]) * 10); + Date date = + new SimpleDateFormat("MMM d, yyyy", Locale.US).parse( + tokens[3]); + + games.add(new ComputerGame(name, date.getYear() + 1900, + metacritic, userScore)); + } + + br.close(); + } catch (IOException | ParseException ex) { + ex.printStackTrace(); + } + } + + /** + * Gibt die Liste der Spiele zurück. + * + * @return Liste der Spiele + */ + public List getGames() { + return new ArrayList<>(games); + } +} diff --git a/solutions/src/main/java/pr2/streams/map_filter/MapFilterGames.java b/solutions/src/main/java/pr2/streams/map_filter/MapFilterGames.java new file mode 100644 index 0000000..f9d095f --- /dev/null +++ b/solutions/src/main/java/pr2/streams/map_filter/MapFilterGames.java @@ -0,0 +1,47 @@ +package pr2.streams.map_filter; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +/** + * Spiele auflisten. + */ +public class MapFilterGames { + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + GameDatabase db = new GameDatabase(); + List games = db.getGames(); + + // Alle Spiele von 2010 mit einem Metascore >= 80 + // und einem User-Score >= 80 + Stream stream = games.stream(); + stream.filter(g -> g.getYear() == 2010) + .filter(g -> g.getMetaScore() >= 80) + .filter(g -> g.getUserScore() >= 80).forEach( + System.out::println); + + // Größter und kleinster Unterschied + stream = games.stream(); + Optional o = stream.max((a, b) -> ( + a.getMetaScore() - a.getUserScore() - b.getMetaScore() + + b.getUserScore())); + if (o.isPresent()) { + System.out.println("Größte Abweichung: " + o.get()); + } + + stream = games.stream(); + o = stream.min((a, b) -> ( + a.getMetaScore() - a.getUserScore() - b.getMetaScore() + + b.getUserScore())); + + if (o.isPresent()) { + System.out.println("Kleinste Abweichung: " + o.get()); + } + } +} diff --git a/solutions/src/main/java/pr2/streams/reduce/Squarer.java b/solutions/src/main/java/pr2/streams/reduce/Squarer.java new file mode 100644 index 0000000..22cad1e --- /dev/null +++ b/solutions/src/main/java/pr2/streams/reduce/Squarer.java @@ -0,0 +1,25 @@ +package pr2.streams.reduce; + +import java.util.List; + +import static java.util.stream.Collectors.summingInt; + +public class Squarer { + public static int mitMap(List zahlen) { + //= Arrays.asList(1, 5, 8, 9, 12, 10, 3); + int mitMap; + + mitMap = zahlen.stream() + .map(e -> e * e) + .collect(summingInt(e -> e)); + return mitMap; + } + + public static int ohneMap(List zahlen) { + int ohneMap; + ohneMap = zahlen.stream() + .reduce((a, b) -> a + b * b) + .orElse(0); + return ohneMap; + } +} diff --git a/solutions/src/main/java/pr2/streams/reduce_critics/ComputerGame.java b/solutions/src/main/java/pr2/streams/reduce_critics/ComputerGame.java new file mode 100644 index 0000000..4410562 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/reduce_critics/ComputerGame.java @@ -0,0 +1,88 @@ +package pr2.streams.reduce_critics; + +/** + * Computerspiel. + */ +public class ComputerGame { + + /** + * Name. + */ + private final String name; + + /** + * Jahr. + */ + private final int year; + + /** + * Metacritic. + */ + private final int metaScore; + + /** + * Userscore. + */ + private final int userScore; + + /** + * Legt ein neues Spiel an. + * + * @param name Name des Spiels. + * @param year Jahr. + * @param metaScore Metacritic-Bewertung. + * @param userScore Nutzer-Bewertung. + */ + public ComputerGame(String name, int year, int metaScore, int userScore) { + + this.name = name; + this.year = year; + this.metaScore = metaScore; + this.userScore = userScore; + } + + /** + * Name des Spiels. + * + * @return Der Name + */ + public String getName() { + return name; + } + + /** + * Jahr, in dem das Spiel erschienen ist bzw. kritisiert wurde. + * + * @return Das Erscheinungsjahr. + */ + public int getYear() { + return year; + } + + /** + * Die Metacritic-Bewertung (0-100). + * + * @return Die Bewertung. + */ + public int getMetaScore() { + return metaScore; + } + + /** + * Die Benutzerbewertung (0-100). + * + * @return Die Benutzerbewertung. + */ + public int getUserScore() { + return userScore; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("%d;%s;%s;%d", metaScore, name, userScore / 10.0, + year); + } +} diff --git a/solutions/src/main/java/pr2/streams/reduce_critics/GameDatabase.java b/solutions/src/main/java/pr2/streams/reduce_critics/GameDatabase.java new file mode 100644 index 0000000..771b8d4 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/reduce_critics/GameDatabase.java @@ -0,0 +1,61 @@ +package pr2.streams.reduce_critics; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** + * Datenbank für die Spiele. + */ +public class GameDatabase { + + private final List games; + + /** + * Datenbank mit Spieleinfomrationen. + */ + @SuppressWarnings("deprecation") + public GameDatabase() { + games = new ArrayList<>(); + + try { + BufferedReader br = + new BufferedReader( + new FileReader("games.txt")); + + String line; + + while ((line = br.readLine()) != null) { + String[] tokens = line.split(";"); + int metacritic = Integer.parseInt(tokens[0]); + String name = tokens[1]; + int userScore = (int) (Double.parseDouble(tokens[2]) * 10); + Date date = + new SimpleDateFormat("MMM d, yyyy", Locale.US).parse( + tokens[3]); + + games.add(new ComputerGame(name, date.getYear() + 1900, + metacritic, userScore)); + } + + br.close(); + } catch (IOException | ParseException ex) { + ex.printStackTrace(); + } + } + + /** + * Gibt die Liste der Spiele zurück. + * + * @return Liste der Spiele + */ + public List getGames() { + return new ArrayList<>(games); + } +} diff --git a/solutions/src/main/java/pr2/streams/reduce_critics/MapReduceGames.java b/solutions/src/main/java/pr2/streams/reduce_critics/MapReduceGames.java new file mode 100644 index 0000000..265191b --- /dev/null +++ b/solutions/src/main/java/pr2/streams/reduce_critics/MapReduceGames.java @@ -0,0 +1,41 @@ +package pr2.streams.reduce_critics; + +import java.util.List; +import java.util.stream.Stream; + +/** + * Spiele auflisten. + */ +public class MapReduceGames { + + /** + * Hauptmethode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + GameDatabase db = new GameDatabase(); + List games = db.getGames(); + + // Abweichung des Metascores von dem Userscore + // als quadratisches Mittel berechnen. + Stream stream = games.stream(); + + double rms = stream.map(g -> g.getMetaScore() - g.getUserScore()) + .map(g -> g * g) + .reduce(0, (sum, value) -> sum + value); + rms /= games.size(); + rms = Math.sqrt(rms); + + // Abweichung als arithmetisches Mittel + stream = games.stream(); + double mittelwert = stream.map( + g -> g.getMetaScore() - g.getUserScore()) + .reduce(0, (sum, value) -> sum + value); + mittelwert /= games.size(); + + System.out.printf("Abweichung Metascore: Durchschnitt=%.2f%n", + mittelwert); + System.out.printf("Abweichung Metascore: RMS=%.2f%n", rms); + } +} diff --git a/solutions/src/main/java/pr2/streams/summieren/SumUp.java b/solutions/src/main/java/pr2/streams/summieren/SumUp.java new file mode 100644 index 0000000..71ae1a1 --- /dev/null +++ b/solutions/src/main/java/pr2/streams/summieren/SumUp.java @@ -0,0 +1,11 @@ +package pr2.streams.summieren; + +import java.util.stream.Stream; + +public class SumUp { + public static int sumUp(Stream numbers) { + int result; + result = numbers.reduce(0, (x, y) -> x + y); + return result; + } +} diff --git a/solutions/src/main/java/pr2/streams/word_count/WordCount.java b/solutions/src/main/java/pr2/streams/word_count/WordCount.java new file mode 100644 index 0000000..299dd1a --- /dev/null +++ b/solutions/src/main/java/pr2/streams/word_count/WordCount.java @@ -0,0 +1,20 @@ +package pr2.streams.word_count; + +import java.util.List; + +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toList; + +public class WordCount { + public static List count(List liste) { + List result; + + result = liste.stream() + .collect(groupingBy(s -> s)) + .entrySet().stream() + .map(e -> e.getKey() + "->" + e.getValue().size()) + .collect(toList()); + + return result; + } +} diff --git a/solutions/src/main/java/pr2/threads/fakultaet/FakultaetParallel.java b/solutions/src/main/java/pr2/threads/fakultaet/FakultaetParallel.java new file mode 100644 index 0000000..2e141e9 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/fakultaet/FakultaetParallel.java @@ -0,0 +1,51 @@ +package pr2.threads.fakultaet; + +public class FakultaetParallel { + + private long[] ergebnisse; + + private long fact(long n) { + return (n == 0 ? 1 : n * fact(n - 1)); + } + + private class FactThread implements Runnable { + + int startPunkt; + int endPunkt; + + public FactThread(int startPunkt, int endPunkt) { + this.startPunkt = startPunkt; + this.endPunkt = endPunkt; + } + + @Override + public void run() { + + for (int n = startPunkt; n <= endPunkt; n++) { + ergebnisse[n] = fact(n); + } + } + } + + public long[] calculate(int bis) { + + if ((bis <= 0) || (bis > 20)) { + throw new IllegalArgumentException("0 < n <= 20"); + } + + ergebnisse = new long[bis + 1]; + + Thread t1 = new Thread(new FactThread(0, bis / 2)); + Thread t2 = new Thread(new FactThread(bis / 2, bis)); + t1.start(); + t2.start(); + try { + t1.join(); + t2.join(); + } catch (InterruptedException e) { + // ignorieren + } + + return ergebnisse.clone(); + } +} diff --git a/solutions/src/main/java/pr2/threads/fakultaet/Main.java b/solutions/src/main/java/pr2/threads/fakultaet/Main.java new file mode 100644 index 0000000..cf56f2d --- /dev/null +++ b/solutions/src/main/java/pr2/threads/fakultaet/Main.java @@ -0,0 +1,13 @@ +package pr2.threads.fakultaet; + +public class Main { + public static void main(String[] args) { + FakultaetParallel fp = new FakultaetParallel(); + long[] ergebnisse = fp.calculate(20); + + for (int i = 0; i < ergebnisse.length; i++) { + long ergebnis = ergebnisse[i]; + System.out.printf("fact(%d) = %d%n", i, ergebnis); + } + } +} diff --git a/solutions/src/main/java/pr2/threads/interrupt/ThreadsBeenden.java b/solutions/src/main/java/pr2/threads/interrupt/ThreadsBeenden.java new file mode 100644 index 0000000..3070d20 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/interrupt/ThreadsBeenden.java @@ -0,0 +1,26 @@ +package pr2.threads.interrupt; + +public class ThreadsBeenden { + + public static void main(String[] args) throws InterruptedException { + Thread t = new Thread(new Runnable() { + + @Override + public void run() { + while (!Thread.currentThread().isInterrupted()) { + System.out.println("Paralleler Thread"); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + break; + } + } + } + }); + + t.start(); + Thread.sleep(2000); + t.interrupt(); + } +} diff --git a/solutions/src/main/java/pr2/threads/notifier/Main.java b/solutions/src/main/java/pr2/threads/notifier/Main.java new file mode 100644 index 0000000..aa4f490 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/notifier/Main.java @@ -0,0 +1,40 @@ +package pr2.threads.notifier; + +public class Main { + + private static final int SLEEP_TIME = 200; + + public static void main(String[] args) { + + final Notifier notifier = new Notifier(); + + Runnable putter = () -> { + while (true) { + notifier.setString(Thread.currentThread().getName()); + try { + Thread.sleep(SLEEP_TIME); + } catch (InterruptedException e) { + return; + } + } + }; + + Runnable getter = () -> { + while (true) { + System.out.println(notifier.getString()); + + try { + Thread.sleep(SLEEP_TIME); + } catch (InterruptedException e) { + return; + } + } + }; + + new Thread(putter, "Putter 1").start(); + new Thread(putter, "Putter 2").start(); + new Thread(getter, "Getter 1").start(); + new Thread(getter, "Getter 2").start(); + new Thread(getter, "Getter 3").start(); + } +} diff --git a/solutions/src/main/java/pr2/threads/notifier/Notifier.java b/solutions/src/main/java/pr2/threads/notifier/Notifier.java new file mode 100644 index 0000000..2a8b373 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/notifier/Notifier.java @@ -0,0 +1,34 @@ +package pr2.threads.notifier; + +public class Notifier { + + private String theString; + + public synchronized String getString() { + while (theString == null) { + try { + wait(); + } catch (InterruptedException e) { + return null; // simply return + } + } + + String result = theString; + theString = null; + notifyAll(); + return result; + } + + public synchronized void setString(String string) { + while (theString != null) { + try { + wait(); + } catch (InterruptedException e) { + return; // simply return + } + } + + theString = string; + notifyAll(); + } +} diff --git a/solutions/src/main/java/pr2/threads/paralleldrucker/ParallelDrucker.java b/solutions/src/main/java/pr2/threads/paralleldrucker/ParallelDrucker.java new file mode 100644 index 0000000..ad44743 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/paralleldrucker/ParallelDrucker.java @@ -0,0 +1,25 @@ +package pr2.threads.paralleldrucker; + +public class ParallelDrucker { + + public static void main(String[] args) { + Thread t1 = new Thread(() -> { + while (true) { + System.out.println("Thread 1 speaking"); + } + }); + + Thread t2 = new Thread(() -> { + while (true) { + System.out.println("Thread 2 speaking"); + } + }); + + t1.start(); + t2.start(); + + while (true) { + System.out.println("Main Thread speaking"); + } + } +} diff --git a/solutions/src/main/java/pr2/threads/race_condition/Main.java b/solutions/src/main/java/pr2/threads/race_condition/Main.java new file mode 100644 index 0000000..ee66523 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/race_condition/Main.java @@ -0,0 +1,41 @@ +package pr2.threads.race_condition; + +import java.util.Arrays; +import java.util.List; + +/** + * Haupklasse. + */ +public class Main { + + /** + * Start-Methode. + * + * @param args Kommandozeilenargumente. + */ + public static void main(String[] args) { + + NumberList numbers = new NumberList(); + + // Threads anlegen + List threads = Arrays.asList( + new Thread(new NumberIncrementer(100000, numbers)), + new Thread(new NumberIncrementer(100000, numbers)), + new Thread(new NumberIncrementer(100000, numbers))); + + // Threads starten + threads.forEach(Thread::start); + + // Auf Ende der Threads warten + threads.forEach(t -> { + try { + t.join(); + } catch (InterruptedException e) { + // ignore + } + }); + + // Zahlen überprüfen + numbers.check(); + } +} diff --git a/solutions/src/main/java/pr2/threads/race_condition/NumberIncrementer.java b/solutions/src/main/java/pr2/threads/race_condition/NumberIncrementer.java new file mode 100644 index 0000000..d72a590 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/race_condition/NumberIncrementer.java @@ -0,0 +1,42 @@ +package pr2.threads.race_condition; + +/** + * Runnable, dass Zahlen inkrementieren kann. + */ +public class NumberIncrementer implements Runnable { + + /** + * Zahl, bis zu der gearbeitet werden soll. + */ + private final int boundary; + + /** + * Speicher für die generierten Zahlen. + */ + private final NumberList numberList; + + /** + * Legt ein neues Objekt an. + * + * @param boundary Obergrenze für die Generierung + * @param numberList Speicher für die Zahlen + */ + public NumberIncrementer(int boundary, NumberList numberList) { + this.boundary = boundary; + this.numberList = numberList; + } + + /** + * @see java.lang.Runnable#run() + */ + @Override + public void run() { + for (int i = 0; i < boundary; i++) { + synchronized (numberList) { + int lastNum = numberList.getLastNumber(); + lastNum++; + numberList.add(lastNum); + } + } + } +} diff --git a/solutions/src/main/java/pr2/threads/race_condition/NumberList.java b/solutions/src/main/java/pr2/threads/race_condition/NumberList.java new file mode 100644 index 0000000..c5ba3f5 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/race_condition/NumberList.java @@ -0,0 +1,60 @@ +package pr2.threads.race_condition; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Einfache Sammlung von Zahlen. + */ +public class NumberList { + + /** + * Die gespeicherten Zahlen. + */ + private final List numbers = + Collections.synchronizedList(new ArrayList<>()); + + /** + * Die letzte Zahl, die gespeichert wurde. + */ + private int lastNumber; + + /** + * Liefert die letzte Zahl, die gespeichert wurde. + * + * @return letzte Zahl. + */ + public int getLastNumber() { + return lastNumber; + } + + /** + * Fügt eine neue Zahl hinzu. + * + * @param number die zu speichernde Zahl. + */ + public void add(int number) { + lastNumber = number; + numbers.add(number); + } + + /** + * Überprüft, ob die Zahlen fortlaufend sind. + * + * @throws IllegalArgumentException wenn die Zahlen nicht fortlaufend sind + */ + public void check() { + + int number = 0; + + for (Integer integer : numbers) { + number++; + if (integer != number) { + throw new IllegalStateException( + "Zahlen nicht fortlaufend!" + " erwartet: " + number + + " gefunden: " + integer); + } + } + } +} diff --git a/solutions/src/main/java/pr2/threads/stack_heap/ThreadProblem.java b/solutions/src/main/java/pr2/threads/stack_heap/ThreadProblem.java new file mode 100644 index 0000000..2548c09 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/stack_heap/ThreadProblem.java @@ -0,0 +1,32 @@ +package pr2.threads.stack_heap; + +public class ThreadProblem { + + private int i = 0; + + public static void main(String[] args) { + new ThreadProblem().go(); + } + + public void go() { + new Thread(new Incrementer()).start(); + new Thread(new Incrementer()).start(); + new Thread(new Incrementer()).start(); + } + + private class Incrementer implements Runnable { + + private int j = 0; + + @Override + public void run() { + int k = 0; + + i++; + j++; + k++; + + System.out.printf("i=%d, j=%d, k=%d%n", i, j, k); + } + } +} diff --git a/solutions/src/main/java/pr2/threads/synchronize/Synchronizer.java b/solutions/src/main/java/pr2/threads/synchronize/Synchronizer.java new file mode 100644 index 0000000..6507ba5 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/synchronize/Synchronizer.java @@ -0,0 +1,24 @@ +package pr2.threads.synchronize; + +public class Synchronizer { + + private int i = 0; + + public static void main(String[] args) { + + final Synchronizer s = new Synchronizer(); + + Runnable runner = () -> { + while (true) { + s.addAndPrint(); + } + }; + + new Thread(runner).start(); + new Thread(runner).start(); + } + + public synchronized void addAndPrint() { + System.out.println(i++); + } +} diff --git a/solutions/src/main/java/pr2/threads/timer/FakultaetTimer.java b/solutions/src/main/java/pr2/threads/timer/FakultaetTimer.java new file mode 100644 index 0000000..a67d5fd --- /dev/null +++ b/solutions/src/main/java/pr2/threads/timer/FakultaetTimer.java @@ -0,0 +1,39 @@ +/* (c) 2010 Thomas Smits */ +package pr2.threads.timer; + +import java.util.Timer; +import java.util.TimerTask; + +public class FakultaetTimer { + + private long fact(long n) { + return (n == 0 ? 1 : n * fact(n - 1)); + } + + public long[] calculate() { + + final long[] ergebnisse = new long[21]; + + class MyTask extends TimerTask { + + private final int pos; + + public MyTask(int pos) { + this.pos = pos; + } + + @Override + public void run() { + ergebnisse[pos] = fact(pos); + } + } + + Timer timer = new Timer(); + + for (int i = 0; i < ergebnisse.length; i++) { + timer.schedule(new MyTask(i), 0); + } + + return ergebnisse; + } +} diff --git a/solutions/src/main/java/pr2/threads/timer/Main.java b/solutions/src/main/java/pr2/threads/timer/Main.java new file mode 100644 index 0000000..0162793 --- /dev/null +++ b/solutions/src/main/java/pr2/threads/timer/Main.java @@ -0,0 +1,14 @@ +package pr2.threads.timer; + +public class Main { + + public static void main(String[] args) { + FakultaetTimer ft = new FakultaetTimer(); + long[] result = ft.calculate(); + + for (int i = 0; i < result.length; i++) { + long ergebnis = result[i]; + System.out.printf("fact(%d) = %d%n", i, ergebnis); + } + } +} diff --git a/solutions/src/main/java/pr2/vererbung/finals/A.java b/solutions/src/main/java/pr2/vererbung/finals/A.java new file mode 100644 index 0000000..a2c7933 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/finals/A.java @@ -0,0 +1,32 @@ +package pr2.vererbung.finals; + +/** + * A-Klasse. + */ +public class A { + + /** + * Konstante für die Vorzeichenumkehr. + */ + public static final int KONSTANTE = 100; + + /** + * Addiert zwei Zahlen. Wenn das Ergebnis größer ist als + * der Wert von KONSTANTE, dann wird das + * Vorzeichen umgekehrt. + * + * @param a erster Wert + * @param b zweiter Wert + * @return Ergebnis + */ + public final int add(final int a, final int b) { + final int result = a + b; + + if (result > KONSTANTE) { + return result * -1; + } + else { + return result; + } + } +} diff --git a/solutions/src/main/java/pr2/vererbung/finals/B.java b/solutions/src/main/java/pr2/vererbung/finals/B.java new file mode 100644 index 0000000..7e3fb1c --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/finals/B.java @@ -0,0 +1,22 @@ +package pr2.vererbung.finals; + +/** + * B-Klasse. + */ +public final class B extends A { + + /** + * Subtrahiert zwei Zahlen. Wenn das Ergebnis kleiner ist als + * der Wert von KONSTANTE, dann wird das + * Vorzeichen umgekehrt. + * + * @param a erster Wert + * @param b zweiter Wert + * @return Ergebnis + */ + public static int sub(final int a, final int b) { + final int result = a + b; + + return (result < KONSTANTE) ? (result * -1) : (result); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie1/Figur.java b/solutions/src/main/java/pr2/vererbung/geometrie1/Figur.java new file mode 100644 index 0000000..193626a --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie1/Figur.java @@ -0,0 +1,14 @@ +package pr2.vererbung.geometrie1; + +public class Figur { + + protected int flaeche; + + protected Figur() { + /* nichts zu tun */ + } + + public int getFlaeche() { + return flaeche; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie1/Main.java b/solutions/src/main/java/pr2/vererbung/geometrie1/Main.java new file mode 100644 index 0000000..803774b --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie1/Main.java @@ -0,0 +1,12 @@ +package pr2.vererbung.geometrie1; + +public class Main { + + public static void main(String[] args) { + Figur f1 = new Rechteck(10, 10); + Figur f2 = new Rechteck(5, 10); + + System.out.println(f1.getFlaeche()); + System.out.println(f2.getFlaeche()); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie1/Rechteck.java b/solutions/src/main/java/pr2/vererbung/geometrie1/Rechteck.java new file mode 100644 index 0000000..3e5be9f --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie1/Rechteck.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie1; + +public class Rechteck extends Figur { + + public Rechteck(int breite, int hoehe) { + flaeche = breite * hoehe; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie2/Figur.java b/solutions/src/main/java/pr2/vererbung/geometrie2/Figur.java new file mode 100644 index 0000000..cc8cf39 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie2/Figur.java @@ -0,0 +1,6 @@ +package pr2.vererbung.geometrie2; + +public class Figur { + + private final int flaeche; + diff --git a/solutions/src/main/java/pr2/vererbung/geometrie2/Main.java b/solutions/src/main/java/pr2/vererbung/geometrie2/Main.java new file mode 100644 index 0000000..bf3ee32 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie2/Main.java @@ -0,0 +1,12 @@ +package pr2.vererbung.geometrie2; + +public class Main { + + public static void main(String[] args) { + Figur f1 = new Rechteck(10, 10); + Figur f2 = new Rechteck(5, 10); + + System.out.println(f1.getFlaeche()); + System.out.println(f2.getFlaeche()); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie2/Rechteck.java b/solutions/src/main/java/pr2/vererbung/geometrie2/Rechteck.java new file mode 100644 index 0000000..edac2b5 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie2/Rechteck.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie2; + + +public class Rechteck extends Figur { + + public Rechteck(int breite, int hoehe) { + super(breite * hoehe); + } diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Dreieck.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Dreieck.java new file mode 100644 index 0000000..e878a60 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Dreieck.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie3; + +public class Dreieck extends Figur { + + public Dreieck(int grundseite, int hoehe) { + super(grundseite * hoehe / 2); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Figur.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Figur.java new file mode 100644 index 0000000..983f4ea --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Figur.java @@ -0,0 +1,19 @@ +package pr2.vererbung.geometrie3; + +public class Figur { + + private int flaeche; + + protected Figur() { + /* leer */ + } + + protected Figur(int flaeche) { + this.flaeche = flaeche; + } + + public int getFlaeche() { + return flaeche; + } + +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Gerade.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Gerade.java new file mode 100644 index 0000000..11d1749 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Gerade.java @@ -0,0 +1,17 @@ +package pr2.vererbung.geometrie3; + +public class Gerade extends Figur { + + private final int laenge; + + public Gerade(int laenge) { + this.laenge = laenge; + } + + @Override + public String toString() { + return "Gerade{" + + "laenge=" + laenge + + '}'; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Main.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Main.java new file mode 100644 index 0000000..ef073b9 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Main.java @@ -0,0 +1,12 @@ +package pr2.vererbung.geometrie3; + +public class Main { + + public static void main(String[] args) { + Figur f1 = new Gerade(10); + Figur f2 = new Gerade(5); + + System.out.println(f1.getFlaeche()); + System.out.println(f2.getFlaeche()); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Quadrat.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Quadrat.java new file mode 100644 index 0000000..1bd3232 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Quadrat.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie3; + +public class Quadrat extends Rechteck { + + public Quadrat(int seitenlaenge) { + super(seitenlaenge, seitenlaenge); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/geometrie3/Rechteck.java b/solutions/src/main/java/pr2/vererbung/geometrie3/Rechteck.java new file mode 100644 index 0000000..a02354c --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/geometrie3/Rechteck.java @@ -0,0 +1,8 @@ +package pr2.vererbung.geometrie3; + +public class Rechteck extends Figur { + + public Rechteck(int breite, int hoehe) { + super(breite * hoehe); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/konstruktoren/Nachtelf.java b/solutions/src/main/java/pr2/vererbung/konstruktoren/Nachtelf.java new file mode 100644 index 0000000..97b8477 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/konstruktoren/Nachtelf.java @@ -0,0 +1,47 @@ +package pr2.vererbung.konstruktoren; + +/** + * Nachtelf aus der Allianz. + */ +public class Nachtelf extends Wesen { + + /** + * Standardmäßige Stärke der Fähigkeit Naturwiderstand. + */ + public static final int STANDARD_NATURWIDERSTAND = 5; + + /** + * Fähigkeit zum Widerstand gegen Naturmagie. + */ + private int naturwiderstand; + + /** + * Legt einen neuen Nachtelf an. + * + * @param name Name der Figur. + * @param naturwiderstand Stärke der Fähigkeit Naturwiderstand. + */ + public Nachtelf(String name, int naturwiderstand) { + super(name); + this.naturwiderstand = naturwiderstand; + } + + /** + * Legt einen neuen Nachtelf an. Die Stärke des Naturwiderstandes entspricht + * dem Standardwert. + * + * @param name Name der Figur. + */ + public Nachtelf(String name) { + this(name, STANDARD_NATURWIDERSTAND); + } + + /** + * Stärke des Naturwiderstandes. + * + * @return the naturwiderstand + */ + public int getNaturwiderstand() { + return naturwiderstand; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/konstruktoren/Untoter.java b/solutions/src/main/java/pr2/vererbung/konstruktoren/Untoter.java new file mode 100644 index 0000000..acd5d9f --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/konstruktoren/Untoter.java @@ -0,0 +1,47 @@ +package pr2.vererbung.konstruktoren; + +/** + * Untoter aus der Horde. + */ +public class Untoter extends Wesen { + + /** + * Standardmäßige Stärke der Fähigkeit zur Unterwasseratmung. + */ + public static final int STANDARD_UNTERWASSERATMUNG = 10; + + /** + * Fähigkeit zur Atmung unter Wasser. + */ + private int unterwasseratmung; + + /** + * Legt einen neuen Untoten an. + * + * @param name Name der Figur. + * @param unterwasseratmung Stärke der Fähigkeit zur Unterwasseratmung. + */ + public Untoter(String name, int unterwasseratmung) { + super(name); + this.unterwasseratmung = unterwasseratmung; + } + + /** + * Legt einen neuen Untoten an. Die Stärke der Unterwasseratmung entspricht + * dem Standardwert. + * + * @param name Name der Figur. + */ + public Untoter(String name) { + this(name, STANDARD_UNTERWASSERATMUNG); + } + + /** + * Fähigkeit zur Unterwasseratmnung. + * + * @return the Stärke der Fähigkeit. + */ + public int getUnterwasseratmung() { + return unterwasseratmung; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/konstruktoren/Wesen.java b/solutions/src/main/java/pr2/vererbung/konstruktoren/Wesen.java new file mode 100644 index 0000000..0287b62 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/konstruktoren/Wesen.java @@ -0,0 +1,30 @@ +package pr2.vererbung.konstruktoren; + +/** + * Basisklasse für Spielfiguren. + */ +public class Wesen { + + /** + * Name der Spielfigur. + */ + private final String name; + + /** + * Legt eine neue Spielfigur an. + * + * @param name Name der Figur. + */ + public Wesen(String name) { + this.name = name; + } + + /** + * Gibt den Namen der Spielfigur zurück. + * + * @return Name der Spielfigur. + */ + public String getName() { + return name; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Affe.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Affe.java new file mode 100644 index 0000000..612e4ee --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Affe.java @@ -0,0 +1,16 @@ +package pr2.vererbung.polymorphie; + +/** + * Ein Affe im Zoo. + */ +public class Affe extends ZooTier { + + /** + * Legt einen neuen Affen an. + * + * @param name Name des Affen. + */ + public Affe(String name) { + super(name); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Futterstelle.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Futterstelle.java new file mode 100644 index 0000000..96e6fb8 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Futterstelle.java @@ -0,0 +1,17 @@ +package pr2.vererbung.polymorphie; + +/** + * Fütterung der Tiere. + */ +public class Futterstelle { + + /** + * Füttert das Tier. + * + * @param tier Tier, das gefüttert werden soll. + */ + public void gibFutter(ZooTier tier) { + tier.fuettern(); + } + +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Giraffe.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Giraffe.java new file mode 100644 index 0000000..1c4cf69 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Giraffe.java @@ -0,0 +1,16 @@ +package pr2.vererbung.polymorphie; + +/** + * Eine Giraffe im Zoo. + */ +public class Giraffe extends ZooTier { + + /** + * Legt einen neue Giraffe an. + * + * @param name Name der Giraffe. + */ + public Giraffe(String name) { + super(name); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/Gorilla.java b/solutions/src/main/java/pr2/vererbung/polymorphie/Gorilla.java new file mode 100644 index 0000000..fd6f23d --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/Gorilla.java @@ -0,0 +1,16 @@ +package pr2.vererbung.polymorphie; + +/** + * Ein Gorilla. + */ +public class Gorilla extends Affe { + + /** + * Legt einen neuen Gorilla an. + * + * @param name Name des Gorilla. + */ + public Gorilla(String name) { + super(name); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/ZooSimulation.java b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooSimulation.java new file mode 100644 index 0000000..e205954 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooSimulation.java @@ -0,0 +1,40 @@ +package pr2.vererbung.polymorphie; + +/** + * Simulationsklasse. + */ +public final class ZooSimulation { + + /** + * Konstruktor. + */ + private ZooSimulation() { + // keine Objekte benötigt + } + + /** + * Main-Methode. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + Futterstelle futterstelle = new Futterstelle(); + + ZooTier[] tiere = {new Affe("Charlie"), new Gorilla("Buck"), + new Giraffe("Debbie")}; + + for (ZooTier tier : tiere) { + System.out.println(tier); + } + + System.out.println("Fütterung..."); + + for (ZooTier tier : tiere) { + futterstelle.gibFutter(tier); + } + + for (ZooTier tier : tiere) { + System.out.println(tier); + } + } +} diff --git a/solutions/src/main/java/pr2/vererbung/polymorphie/ZooTier.java b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooTier.java new file mode 100644 index 0000000..ff9edf9 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/polymorphie/ZooTier.java @@ -0,0 +1,41 @@ +package pr2.vererbung.polymorphie; + +/** + * Ein Tier im Zoo. + */ +public class ZooTier { + + /** + * Name des Tiers. + */ + private final String name; + + /** + * Zeigt an, ob das Tier hungrig ist. + */ + private boolean hungrig = true; + + /** + * Legt ein neues Zootier an. + * + * @param name Name des Tiers + */ + public ZooTier(String name) { + this.name = name; + } + + /** + * Gibt dem Tier futter. + */ + public void fuettern() { + hungrig = false; + } + + /** + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return name + ": Ich bin " + (hungrig ? "hungrig" : "satt") + "!"; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/singleton_einfach/Singleton.java b/solutions/src/main/java/pr2/vererbung/singleton_einfach/Singleton.java new file mode 100644 index 0000000..0436a18 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/singleton_einfach/Singleton.java @@ -0,0 +1,12 @@ +package pr2.vererbung.singleton_einfach; + +public final class Singleton { + + private static final Singleton INSTANCE = new Singleton(); + + private Singleton() { /* leer */ } + + public static Singleton getInstance() { + return INSTANCE; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/statics/Spiel.java b/solutions/src/main/java/pr2/vererbung/statics/Spiel.java new file mode 100644 index 0000000..5959cf4 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/statics/Spiel.java @@ -0,0 +1,35 @@ +package pr2.vererbung.statics; + +/** + * Spiel mit den Würfeln. + */ +public final class Spiel { + + /** + * Keine Objekte. + */ + private Spiel() { + // leer + } + + /** + * Programm-Einstieg. + * + * @param args Kommandozeilen-Argumente. + */ + public static void main(String[] args) { + Wuerfel wuerfel1 = new Wuerfel(); + Wuerfel wuerfel2 = new Wuerfel(); + + // 1000 Mal würfeln + for (int i = 0; i < 1000; i++) { + wuerfel1.wuerfele(); + wuerfel2.wuerfele(); + } + + // Statistik ausgeben + System.out.println("Statistik für alle Würfel"); + System.out.println(Wuerfel.statistik()); + System.out.println(); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/statics/Wuerfel.java b/solutions/src/main/java/pr2/vererbung/statics/Wuerfel.java new file mode 100644 index 0000000..31ee54c --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/statics/Wuerfel.java @@ -0,0 +1,53 @@ +package pr2.vererbung.statics; + +import java.util.Random; + +/** + * Ein einfacher Würfel. + */ +public class Wuerfel { + + /** Häufigkeit der Werte. */ + private static final int[] HAEUFIGKEIT = new int[6]; + + /** Anzahl der Würfe mit dem Würfel. */ + private static int wuerfe = 0; + + /** Zufallsgenerator. */ + private final Random random = new Random(); + + /** + * Bestimmt den nächsten Wurf. + * + * @return der Wurf. + */ + public int wuerfele() { + int wert = random.nextInt(6); + HAEUFIGKEIT[wert]++; + wuerfe++; + return wert + 1; + } + + /** + * Gibt die Häufigkeit der Würfe zurück. + * + * @return die Statistik mit der Häufigkeit. + */ + public static String statistik() { + StringBuilder result = new StringBuilder(); + + for (int i = 0; i < HAEUFIGKEIT.length; i++) { + result.append(i + 1) + .append(": ") + .append(String.format("%.2f %%", + ((double) HAEUFIGKEIT[i] / wuerfe) * 100)) + .append("\n"); + } + + result.append("Summe: ") + .append(wuerfe) + .append("\n"); + + return result.toString(); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberladen_summe/Summator.java b/solutions/src/main/java/pr2/vererbung/ueberladen_summe/Summator.java new file mode 100644 index 0000000..7f0bfa1 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberladen_summe/Summator.java @@ -0,0 +1,20 @@ +package pr2.vererbung.ueberladen_summe; + +public class Summator { + + public int sum(int a, int b) { + return a + b; + } + + public int sum(int a, int b, int c) { + return a + b + c; + } + + public int sum(int a, int b, int c, int d) { + return a + b + c + d; + } + + public int sum(int a, int b, int c, int d, int e) { + return a + b + c + d + e; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Amoebe.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Amoebe.java new file mode 100644 index 0000000..fe89d11 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Amoebe.java @@ -0,0 +1,9 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Amoebe extends Lebewesen { + + @Override + public void bewegen() { + System.out.println("Schleimen"); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Dackel.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Dackel.java new file mode 100644 index 0000000..7056594 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Dackel.java @@ -0,0 +1,13 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Dackel extends Lebewesen { + + @Override + public void bewegen() { + System.out.println("Auf kurzen Beinen vorwärts wackeln"); + } + + public void bellen() { + System.out.println("Wau wau wau"); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Lebewesen.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Lebewesen.java new file mode 100644 index 0000000..85ebef2 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Lebewesen.java @@ -0,0 +1,8 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Lebewesen { + + public void bewegen() { + /* nichts machen */ + } +} diff --git a/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Main.java b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Main.java new file mode 100644 index 0000000..e535a17 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/ueberschreiben_lebewesen/Main.java @@ -0,0 +1,16 @@ +package pr2.vererbung.ueberschreiben_lebewesen; + +public class Main { + + public static void main(String[] args) { + Lebewesen l1 = new Dackel(); + Lebewesen l2 = new Amoebe(); + + l1.bewegen(); + l2.bewegen(); + + if (l1 instanceof Dackel) { + ((Dackel) l1).bellen(); + } + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vararg_summe/Summator.java b/solutions/src/main/java/pr2/vererbung/vararg_summe/Summator.java new file mode 100644 index 0000000..6457e2a --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vararg_summe/Summator.java @@ -0,0 +1,22 @@ +package pr2.vererbung.vararg_summe; + +public class Summator { + + public int sum(int a, int b) { + return a + b; + } + + public int sum(int a, int b, int c) { + return a + b + c; + } + + public int sum(int a, int b, int c, int... as) { + int sum = a + b + c; + + for (int i : as) { + sum += i; + } + + return sum; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Dreieck.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Dreieck.java new file mode 100644 index 0000000..3e2c61c --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Dreieck.java @@ -0,0 +1,17 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Ein Dreieck. + */ +public class Dreieck extends Figur { + + /** + * Erzeugt ein neues Dreieck mit den gegebenen Daten. + * + * @param grundseite Grundseite des Dreiecks. + * @param hoehe Höhe des Dreiecks. + */ + public Dreieck(double grundseite, double hoehe) { + super(grundseite * hoehe / 2); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Figur.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Figur.java new file mode 100644 index 0000000..ebe5383 --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Figur.java @@ -0,0 +1,37 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Basisklasse für geometrische Formen. + */ +public class Figur { + + /** + * Fläche der Figur. + */ + private double flaeche; + + /** + * Legt eine neue Figur mit der Fläche 0 an. + */ + protected Figur() { + /* leer */ + } + + /** + * Legt eine neue Figur mit der gegebenen Fläche an. + * + * @param flaeche Fläche der Figur. + */ + protected Figur(double flaeche) { + this.flaeche = flaeche; + } + + /** + * Liefert die Fläche der Figur. + * + * @return die Fläche. + */ + public double getFlaeche() { + return flaeche; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Gerade.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Gerade.java new file mode 100644 index 0000000..a8af5fd --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Gerade.java @@ -0,0 +1,31 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Eine Gerade. + */ +public class Gerade extends Figur { + + /** + * Länge der Geraden. + */ + private double laenge; + + /** + * Legt eine neue Gerade mit der gegebenen Länge an. + * + * @param laenge Länge der Geraden. + */ + public Gerade(double laenge) { + super(); + this.laenge = laenge; + } + + /** + * Liefert die Länge der Geraden. + * + * @return die Länge. + */ + public double getLaenge() { + return laenge; + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Quadrat.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Quadrat.java new file mode 100644 index 0000000..5e0626f --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Quadrat.java @@ -0,0 +1,16 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Qudrat. + */ +public class Quadrat extends Rechteck { //*** replace(public class Quadrat {) + + /** + * Legt ein neues Quadrat an. + * + * @param seitenlaenge Länge der Seiten des Quadrates. + */ + public Quadrat(double seitenlaenge) { + super(seitenlaenge, seitenlaenge); + } +} diff --git a/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Rechteck.java b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Rechteck.java new file mode 100644 index 0000000..af82bef --- /dev/null +++ b/solutions/src/main/java/pr2/vererbung/vererbung_geometrie/Rechteck.java @@ -0,0 +1,17 @@ +package pr2.vererbung.vererbung_geometrie; + +/** + * Rechteck. + */ +public class Rechteck extends Figur { + + /** + * Legt ein neues Rechteck an. + * + * @param breite Breite. + * @param hoehe Höhe. + */ + public Rechteck(double breite, double hoehe) { + super(breite * hoehe); + } +} diff --git a/solutions/src/test/java/pr2/collections/iterator/test/SimpleStackTest.java b/solutions/src/test/java/pr2/collections/iterator/test/SimpleStackTest.java new file mode 100644 index 0000000..79ce559 --- /dev/null +++ b/solutions/src/test/java/pr2/collections/iterator/test/SimpleStackTest.java @@ -0,0 +1,86 @@ +package pr2.collections.iterator.test; + +import org.junit.jupiter.api.Test; +import pr2.collections.iterator.SimpleStack; + +import java.util.Iterator; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Test für den Stack. + */ +public class SimpleStackTest { + + /** + * Testet den Stack an sich. + */ + @Test + void testStack() { + SimpleStack s = new SimpleStack<>(10); + s.push("A"); + s.push("B"); + s.push("C"); + s.push("D"); + assertEquals("D", s.peek()); + assertEquals("D", s.pop()); + assertEquals("C", s.pop()); + assertEquals("B", s.pop()); + s.push("A2"); + s.push("A3"); + assertEquals("A3", s.peek()); + assertEquals("A3", s.pop()); + assertEquals("A2", s.pop()); + assertEquals("A", s.pop()); + } + + + /** + * Testet den Iterator. + */ + @Test + void testIterator() { + SimpleStack s = new SimpleStack<>(10); + s.push("A"); + s.push("B"); + s.push("C"); + s.push("D"); + + String[] result = new String[5]; + int count = 0; + + for (String string : s) { + result[count++] = string; + } + + assertEquals("D", s.peek()); + + assertEquals("D", result[0]); + assertEquals("C", result[1]); + assertEquals("B", result[2]); + assertEquals("A", result[3]); + + s.push("E"); + + Iterator it = s.iterator(); + + count = 0; + while (it.hasNext()) { + result[count++] = it.next(); + } + + assertEquals("E", result[0]); + assertEquals("D", result[1]); + assertEquals("C", result[2]); + assertEquals("B", result[3]); + assertEquals("A", result[4]); + + assertFalse(it.hasNext()); + + it = s.iterator(); + + assertTrue(it.hasNext()); + } +} diff --git a/solutions/src/test/java/pr2/collections/reverser/test/ReverserTest.java b/solutions/src/test/java/pr2/collections/reverser/test/ReverserTest.java new file mode 100644 index 0000000..09f0091 --- /dev/null +++ b/solutions/src/test/java/pr2/collections/reverser/test/ReverserTest.java @@ -0,0 +1,23 @@ +package pr2.collections.reverser.test; + +import org.junit.jupiter.api.Test; +import pr2.collections.reverser.Reverser; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ReverserTest { + + @Test + void testReverser() { + List testListe = Arrays.asList("Meier", "Zabelmann", "Schulze", + "Xavier", "Albert"); + new Reverser().reverse(testListe); + assertEquals(Arrays.asList( + "Zabelmann", "Xavier", "Schulze", "Meier", "Albert"), + testListe); + } + +} diff --git a/solutions/src/test/java/pr2/collections/reverser_generic/test/ReverserTest.java b/solutions/src/test/java/pr2/collections/reverser_generic/test/ReverserTest.java new file mode 100644 index 0000000..a623dc2 --- /dev/null +++ b/solutions/src/test/java/pr2/collections/reverser_generic/test/ReverserTest.java @@ -0,0 +1,23 @@ +package pr2.collections.reverser_generic.test; + +import org.junit.jupiter.api.Test; +import pr2.collections.reverser_generic.Reverser; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ReverserTest { + + @Test + void testReverser() { + List testListe = Arrays.asList("Meier", "Zabelmann", "Schulze", + "Xavier", "Albert"); + new Reverser().reverse(testListe); + assertEquals(Arrays.asList( + "Zabelmann", "Xavier", "Schulze", "Meier", "Albert"), + testListe); + } + +} diff --git a/solutions/src/test/java/pr2/collections/sortieren/test/SorterTest.java b/solutions/src/test/java/pr2/collections/sortieren/test/SorterTest.java new file mode 100644 index 0000000..a2c30f2 --- /dev/null +++ b/solutions/src/test/java/pr2/collections/sortieren/test/SorterTest.java @@ -0,0 +1,75 @@ +package pr2.collections.sortieren.test; + +import org.junit.jupiter.api.Test; +import pr2.collections.sortieren.Sorter; +import pr2.collections.sortieren.Sorter.SortOrder; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + + +/** + * Test für die Sortierung. + */ +public class SorterTest { + + private static final String[] DATA = + {"aaron", "ALFONS", "bond", "BerND", "henry", "Hugo"}; + + /** + * Testet die Sortierung: aufsteigend. + */ + @Test + void testAscendingSorting() { + + String[] asc = DATA.clone(); + + Sorter.sort(asc, SortOrder.ASCENDING); + + assertArrayEquals( + new String[] {"ALFONS", "BerND", "Hugo", "aaron", "bond", + "henry"}, asc); + } + + /** + * Testet die Sortierung: Absteigend. + */ + @Test + void testDescendingSorting() { + + String[] desc = DATA.clone(); + Sorter.sort(desc, SortOrder.DESCENDING); + + assertArrayEquals( + new String[] {"henry", "bond", "aaron", "Hugo", "BerND", + "ALFONS"}, desc); + } + + /** + * Testet die Sortierung: Aufsteigend, CI. + */ + @Test + void testAscendingCISorting() { + + String[] ascCI = DATA.clone(); + Sorter.sort(ascCI, SortOrder.ASCENDING_CASE_INSENSITIVE); + + assertArrayEquals( + new String[] {"aaron", "ALFONS", "BerND", "bond", "henry", + "Hugo"}, ascCI); + } + + /** + * Testet die Sortierung: Absteigend, CI. + */ + @Test + void testDescendingCISorting() { + + String[] descCI = DATA.clone(); + + Sorter.sort(descCI, SortOrder.DESCENDING_CASE_INSENSITIVE); + + assertArrayEquals( + new String[] {"Hugo", "henry", "bond", "BerND", "ALFONS", + "aaron"}, descCI); + } +} diff --git a/solutions/src/test/java/pr2/enums/eigene/test/WuerfelTest.java b/solutions/src/test/java/pr2/enums/eigene/test/WuerfelTest.java new file mode 100644 index 0000000..09f197d --- /dev/null +++ b/solutions/src/test/java/pr2/enums/eigene/test/WuerfelTest.java @@ -0,0 +1,41 @@ +package pr2.enums.eigene.test; + +import org.junit.jupiter.api.Test; +import pr2.enums.eigene.Wuerfel; +import pr2.enums.eigene.WuerfelTyp; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Test für die Würfel. + */ +public class WuerfelTest { + + /** + * Anzahl der Durchläufe (Gesetz der großen Zahl!). + */ + private static final int RUNS = 10000000; + + @Test + void testFairness() { + for (WuerfelTyp typ : WuerfelTyp.values()) { + internalTestFairness(new Wuerfel(typ), typ.average()); + } + } + + /** + * Interne Hilfsmethode, um die Fairness zu testen. + * + * @param w der zu testende Wuerfel. + * @param expected Erwartungswert. + */ + private void internalTestFairness(Wuerfel w, double expected) { + long sum = 0; + + for (int i = 0; i < RUNS; i++) { + sum += w.roll(); + } + double average = (double) sum / (double) RUNS; + assertEquals(expected, average, 0.1); + } +} diff --git a/solutions/src/test/java/pr2/exceptions/ausnahmen_testen/test/CaesarTest.java b/solutions/src/test/java/pr2/exceptions/ausnahmen_testen/test/CaesarTest.java new file mode 100644 index 0000000..2dda027 --- /dev/null +++ b/solutions/src/test/java/pr2/exceptions/ausnahmen_testen/test/CaesarTest.java @@ -0,0 +1,149 @@ +package pr2.exceptions.ausnahmen_testen.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.exceptions.ausnahmen_testen.CrypterCaesar; +import pr2.exceptions.ausnahmen_testen.IllegalKeyException; +import pr2.exceptions.ausnahmen_testen.IllegalMessageException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +/** + * Testklasse für die Verschlüsselung. + */ +public class CaesarTest { + + + /** + * Testet auf falschen Schlüssel. + * + * @throws pr2.exceptions.ausnahmen_testen.IllegalMessageException + * Wird geworfen, wenn die Nachricht ungültig ist. + * @throws pr2.exceptions.ausnahmen_testen.IllegalKeyException + * Wird geworfen, wenn der Schlüssel ungültig ist. + */ + @Test + void testWrongKey1() + throws IllegalKeyException, IllegalMessageException { + + String key = "AB"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.encrypt(key, "HALLO"); + }); + } + + /** + * Testet auf falschen Schlüssel. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongKey2() + throws IllegalKeyException, IllegalMessageException { + String key = "0"; + CrypterCaesar c = new CrypterCaesar(); + Assertions.assertThrows(IllegalKeyException.class, () -> { + c.encrypt(key, "HALLO"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongMessage1() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalMessageException.class, () -> { + c.encrypt(key, "üäaD&"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongMessage2() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalMessageException.class, () -> { + c.encrypt(key, "üäaD&"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongCypher1() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + + Assertions.assertThrows(IllegalMessageException.class, () -> { + c.decrypt(key, "üäaD&"); + }); + } + + /** + * Testet auf falsche Nachricht. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testWrongCypher2() + throws IllegalKeyException, IllegalMessageException { + String key = "K"; + CrypterCaesar c = new CrypterCaesar(); + Assertions.assertThrows(IllegalMessageException.class, () -> { + c.decrypt(key, "DIESiSTEINTEST&"); + }); + } + + + /** + * Testet die Verschlüsselung an sich. + * + * @throws IllegalMessageException Wird geworfen, wenn die + * Nachricht ungültig ist. + * @throws IllegalKeyException Wird geworfen, wenn der Schlüssel + * ungültig ist. + */ + @Test + void testCaesar() + throws IllegalKeyException, IllegalMessageException { + String klarText = "KATHARGOMUSSFALLEN"; + CrypterCaesar c = new CrypterCaesar(); + assertEquals(klarText, c.decrypt("C", c.encrypt("C", klarText))); + assertEquals("FDHVDU", c.encrypt("C", "CAESAR")); + assertEquals(klarText, c.encrypt("Z", klarText)); + } +} diff --git a/solutions/src/test/java/pr2/exceptions/eigene_ausnahme/test/FuseTest.java b/solutions/src/test/java/pr2/exceptions/eigene_ausnahme/test/FuseTest.java new file mode 100644 index 0000000..5796211 --- /dev/null +++ b/solutions/src/test/java/pr2/exceptions/eigene_ausnahme/test/FuseTest.java @@ -0,0 +1,158 @@ +package pr2.exceptions.eigene_ausnahme.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.exceptions.eigene_ausnahme.Fuse; +import pr2.exceptions.eigene_ausnahme.FuseTrippedException; +import pr2.exceptions.eigene_ausnahme.IllegalCurrentException; + +/** + * Testet die Sicherung. + */ +public class FuseTest { + + + /** + * Testet die Erzeugung von Sicherungen mit gültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid() throws IllegalCurrentException { + new Fuse(Fuse.A16); + new Fuse(Fuse.A25); + new Fuse(Fuse.A32); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid1() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(15); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid2() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(-1); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid3() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(0); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid4() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(Integer.MAX_VALUE); + }); + } + + /** + * Testet die Erzeugung von Sicherungen mit ungültigen Werten. + * + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testCreationValid5() throws IllegalCurrentException { + Assertions.assertThrows(IllegalCurrentException.class, () -> { + new Fuse(Integer.MIN_VALUE); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping1() + throws FuseTrippedException, IllegalCurrentException { + + Fuse f = new Fuse(Fuse.A16); + f.use(5); + f.use(16); + f.use(0); + + f = new Fuse(Fuse.A25); + f.use(5); + f.use(16); + f.use(25); + + + Assertions.assertThrows(FuseTrippedException.class, () -> { + Fuse f2 = new Fuse(Fuse.A16); + f2.use(0); + f2.use(16); + f2.use(25); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping2() + throws FuseTrippedException, IllegalCurrentException { + Assertions.assertThrows(FuseTrippedException.class, () -> { + new Fuse(Fuse.A16).use(17); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping3() + throws FuseTrippedException, IllegalCurrentException { + + Assertions.assertThrows(FuseTrippedException.class, () -> { + new Fuse(Fuse.A16).use(Integer.MAX_VALUE); + }); + } + + /** + * Testet das Auslösen der Sicherung. + * + * @throws FuseTrippedException Sicherung hat ausgelöst. + * @throws IllegalCurrentException ungültiger Wert für die Sicherung. + */ + @Test + void testTripping4() + throws FuseTrippedException, IllegalCurrentException { + Assertions.assertThrows(FuseTrippedException.class, () -> { + new Fuse(Fuse.A32).use(40); + }); + } +} diff --git a/solutions/src/test/java/pr2/exceptions/fakultaet/test/FakultaetTest.java b/solutions/src/test/java/pr2/exceptions/fakultaet/test/FakultaetTest.java new file mode 100644 index 0000000..9c0eda8 --- /dev/null +++ b/solutions/src/test/java/pr2/exceptions/fakultaet/test/FakultaetTest.java @@ -0,0 +1,38 @@ +package pr2.exceptions.fakultaet.test; + +import org.junit.jupiter.api.Test; +import pr2.exceptions.fakultaet.Fakultaet; +import pr2.exceptions.fakultaet.FakultaetException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class FakultaetTest { + + @Test + void testFact() throws FakultaetException { + Fakultaet f = new Fakultaet(); + assertEquals(1, f.fact(0)); + assertEquals(1, f.fact(1)); + assertEquals(2, f.fact(2)); + assertEquals(6, f.fact(3)); + assertEquals(24, f.fact(4)); + assertEquals(3628800, f.fact(10)); + } + + @Test + void testFactEx1() { + assertThrows(FakultaetException.class, () -> { + Fakultaet f = new Fakultaet(); + f.fact(-1); + }); + } + + @Test + void testFactEx2() { + assertThrows(FakultaetException.class, () -> { + Fakultaet f = new Fakultaet(); + f.fact(21); + }); + } +} diff --git a/solutions/src/test/java/pr2/generics/einfach/test/ListeTest.java b/solutions/src/test/java/pr2/generics/einfach/test/ListeTest.java new file mode 100644 index 0000000..2497f84 --- /dev/null +++ b/solutions/src/test/java/pr2/generics/einfach/test/ListeTest.java @@ -0,0 +1,61 @@ +package pr2.generics.einfach.test; + +import org.junit.jupiter.api.Test; +import pr2.generics.einfach.Liste; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * Test für die Liste. + */ +public class ListeTest { + + /** + * Testet das Hinzufügen und Löschen der Liste. + */ + @Test + void testAddAndClear() { + Liste l = new Liste<>(); + + assertEquals(0, l.size()); + + l.add("Hallo"); + assertEquals(1, l.size()); + l.add("Hugo"); + assertEquals(2, l.size()); + l.add("Peter"); + l.add("Alfons"); + assertEquals(4, l.size()); + + l.clear(); + assertEquals(0, l.size()); + } + + /** + * Testet das Lesen von Elementen. + */ + @Test + void testGet() { + Liste l = new Liste<>(); + l.add("Hallo"); + l.add("Hugo"); + l.add("Peter"); + l.add("Alfons"); + + assertNull(l.get(-1)); + assertNull(l.get(4)); + assertEquals("Hallo", l.get(0)); + assertEquals("Hugo", l.get(1)); + assertEquals("Peter", l.get(2)); + assertEquals("Alfons", l.get(3)); + + assertEquals(4, l.size()); + l.clear(); + assertEquals(0, l.size()); + assertNull(l.get(0)); + assertNull(l.get(1)); + assertNull(l.get(2)); + assertNull(l.get(3)); + } +} diff --git a/solutions/src/test/java/pr2/generics/super_extends/test/ListeTest.java b/solutions/src/test/java/pr2/generics/super_extends/test/ListeTest.java new file mode 100644 index 0000000..84997ad --- /dev/null +++ b/solutions/src/test/java/pr2/generics/super_extends/test/ListeTest.java @@ -0,0 +1,42 @@ +package pr2.generics.super_extends.test; + +import org.junit.jupiter.api.Test; +import pr2.generics.super_extends.Liste; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +/** + * Test für die Liste. + */ +public class ListeTest { + + /** + * Testet das Umkopieren. + */ + @Test + void testAddAndClear() { + Liste ls = new Liste<>(); + Liste lo = new Liste<>(); + + ls.add("Hallo"); + ls.add("Hugo"); + ls.add("Peter"); + ls.add("Alfons"); + + ls.copyInto(lo); + + assertEquals("Hallo", lo.get(0)); + assertEquals("Hugo", lo.get(1)); + assertEquals("Peter", lo.get(2)); + assertEquals("Alfons", lo.get(3)); + + lo = new Liste<>(); + lo.fillFrom(ls); + + assertEquals("Hallo", lo.get(0)); + assertEquals("Hugo", lo.get(1)); + assertEquals("Peter", lo.get(2)); + assertEquals("Alfons", lo.get(3)); + } +} diff --git a/solutions/src/test/java/pr2/interfaces/comparable_student/ComparableStudentTest.java b/solutions/src/test/java/pr2/interfaces/comparable_student/ComparableStudentTest.java new file mode 100644 index 0000000..68e2608 --- /dev/null +++ b/solutions/src/test/java/pr2/interfaces/comparable_student/ComparableStudentTest.java @@ -0,0 +1,25 @@ +package pr2.interfaces.comparable_student; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class ComparableStudentTest { + + @Test + void testCompare() { + final Student s1 = new Student("Andreas", "Herrmann", 12348); + final Student s2 = new Student("Frank", "Herrmann", 22348); + final Student s3 = new Student("Alfons", "Meier", 12345); + final Student s4 = new Student("Alfons", "Meier", 12346); + final Student s5 = new Student("Andreas", "Muster", 12347); + + Student[] a = { s1, s2, s3, s4, s5 }; + Student[] expected = a.clone(); + + Arrays.sort(a); + assertArrayEquals(expected, a); + } +} diff --git a/solutions/src/test/java/pr2/interfaces/interfaces_s/test/AnalogControllerTest.java b/solutions/src/test/java/pr2/interfaces/interfaces_s/test/AnalogControllerTest.java new file mode 100644 index 0000000..65dd577 --- /dev/null +++ b/solutions/src/test/java/pr2/interfaces/interfaces_s/test/AnalogControllerTest.java @@ -0,0 +1,52 @@ +package pr2.interfaces.interfaces_s.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.interfaces_s.api.AnalogController; +import pr2.interfaces.interfaces_s.impl.AnalogControllerImpl; + +/** + * Tests für einen analogen Joystick. + */ +public class AnalogControllerTest extends DigitalControllerTest { + + /** + * Testet einen anlogen Controller. + */ + @Test + void testAnalogController() { + AnalogController c = new AnalogControllerImpl(); + testAnalogController(c); + } + + /** + * Interne Hilfsmethode zum Test von analogen Controllern. + * + * @param c Controller, der getestet wird + */ + protected void testAnalogController(AnalogController c) { + c.up(0.5); + assertPointEquals(0, 0, c.getPosition()); + c.up(0.5); + assertPointEquals(0, -1, c.getPosition()); + + c.left(0.3); + c.left(0.3); + c.left(0.3); + assertPointEquals(0, -1, c.getPosition()); + c.left(0.2); + assertPointEquals(-1, -1, c.getPosition()); + + c.down(1.0); + assertPointEquals(-1, 0, c.getPosition()); + + c.down(1.0); + assertPointEquals(-1, 1, c.getPosition()); + c.down(1.0); + assertPointEquals(-1, 2, c.getPosition()); + + c.right(0.5); + c.right(0.5); + c.right(0.5); + assertPointEquals(0, 2, c.getPosition()); + } +} diff --git a/solutions/src/test/java/pr2/interfaces/interfaces_s/test/DigitalControllerTest.java b/solutions/src/test/java/pr2/interfaces/interfaces_s/test/DigitalControllerTest.java new file mode 100644 index 0000000..a533be7 --- /dev/null +++ b/solutions/src/test/java/pr2/interfaces/interfaces_s/test/DigitalControllerTest.java @@ -0,0 +1,62 @@ +package pr2.interfaces.interfaces_s.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.interfaces_s.impl.DigitalControllerImpl; +import pr2.interfaces.interfaces_s.api.DigitalController; + +import java.awt.Point; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Tests für einen digitalen Joystick. + */ +public class DigitalControllerTest { + + /** + * Testet einen digitalen Controller. + */ + @Test + void testDigitalController() { + DigitalController c = new DigitalControllerImpl(); + testDigitalController(c); + } + + /** + * Interne Hilfsmethode zum Test von digitalen Controllern. + * + * @param c Controller, der getestet wird + */ + protected void testDigitalController(DigitalController c) { + assertPointEquals(0, 0, c.getPosition()); + c.up(); + c.up(); + assertPointEquals(0, -2, c.getPosition()); + c.down(); + c.down(); + assertPointEquals(0, 0, c.getPosition()); + c.left(); + c.right(); + assertPointEquals(0, 0, c.getPosition()); + c.left(); + assertPointEquals(-1, 0, c.getPosition()); + c.left(); + assertPointEquals(-2, 0, c.getPosition()); + c.right(); + c.right(); + c.right(); + assertPointEquals(1, 0, c.getPosition()); + } + + /** + * Interne Hilfsmethode, um einen Punkt mit seinem x und + * y-Wert zu vergleichen. + * + * @param x x-Wert + * @param y y-Wert + * @param point Punkt, der verglichen werden soll + */ + protected void assertPointEquals(int x, int y, Point point) { + assertEquals(new Point(x, y), point); + } +} diff --git a/solutions/src/test/java/pr2/interfaces/interfaces_s/test/DualShock4Test.java b/solutions/src/test/java/pr2/interfaces/interfaces_s/test/DualShock4Test.java new file mode 100644 index 0000000..9f4bb3d --- /dev/null +++ b/solutions/src/test/java/pr2/interfaces/interfaces_s/test/DualShock4Test.java @@ -0,0 +1,45 @@ +package pr2.interfaces.interfaces_s.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.interfaces_s.api.AnalogController; +import pr2.interfaces.interfaces_s.api.DigitalController; +import pr2.interfaces.interfaces_s.impl.DualShock4; + + +/** + * Tests für einen analogen Joystick. + */ +public class DualShock4Test extends AnalogControllerTest { + + /** + * Testet einen DualShock4 Kombi-Controller. + */ + @Test + void testDualShock4() { + DigitalController cd = new DualShock4(); + testDigitalController(cd); + + AnalogController ca = new DualShock4(); + testAnalogController(ca); + + DualShock4 ds = new DualShock4(); + + ds.up(); + ds.up(1.0); + assertPointEquals(0, -2, ds.getPosition()); + + ds.left(); + ds.right(); + ds.right(0.5); + ds.right(0.5); + assertPointEquals(1, -2, ds.getPosition()); + + ds.down(); + ds.down(); + ds.down(0.3); + ds.down(0.3); + ds.down(0.3); + ds.down(0.1); + assertPointEquals(1, 1, ds.getPosition()); + } +} diff --git a/solutions/src/test/java/pr2/interfaces/stack/StackTest.java b/solutions/src/test/java/pr2/interfaces/stack/StackTest.java new file mode 100644 index 0000000..8f058aa --- /dev/null +++ b/solutions/src/test/java/pr2/interfaces/stack/StackTest.java @@ -0,0 +1,40 @@ +package pr2.interfaces.stack; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.stack.Stack; +import pr2.interfaces.stack.StackImpl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class StackTest { + + @Test + void testStack() { + Stack s = new StackImpl(100); + + assertEquals(0, s.size()); + + s.push("Hallo"); + s.push("wie"); + s.push("gehts"); + + assertEquals(3, s.size()); + + assertEquals("gehts", s.peek()); + assertEquals("gehts", s.pop()); + + assertEquals("wie", s.peek()); + assertEquals("wie", s.pop()); + + assertEquals("Hallo", s.peek()); + assertEquals("Hallo", s.pop()); + + assertNull(s.pop()); + assertEquals(0, s.size()); + + s.push("A"); + assertEquals("A", s.pop()); + assertNull(s.pop()); + } +} diff --git a/solutions/src/test/java/pr2/interfaces/stack/test/StackTest.java b/solutions/src/test/java/pr2/interfaces/stack/test/StackTest.java new file mode 100644 index 0000000..4c1534f --- /dev/null +++ b/solutions/src/test/java/pr2/interfaces/stack/test/StackTest.java @@ -0,0 +1,35 @@ +package pr2.interfaces.stack.test; + +import org.junit.jupiter.api.Test; +import pr2.interfaces.stack.Stack; +import pr2.interfaces.stack.StackImpl; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class StackTest { + + @Test + void testStack() { + Stack s = new StackImpl(100); + + assertEquals(0, s.size()); + + s.push("Hallo"); + s.push("wie"); + s.push("gehts"); + + assertEquals(3, s.size()); + + assertEquals("gehts", s.peek()); + assertEquals("gehts", s.pop()); + + assertEquals("wie", s.peek()); + assertEquals("wie", s.pop()); + + assertEquals("Hallo", s.peek()); + assertEquals("Hallo", s.pop()); + + assertNull(s.pop()); + } +} diff --git a/solutions/src/test/java/pr2/io/data_output/test/BoardTest.java b/solutions/src/test/java/pr2/io/data_output/test/BoardTest.java new file mode 100644 index 0000000..2068828 --- /dev/null +++ b/solutions/src/test/java/pr2/io/data_output/test/BoardTest.java @@ -0,0 +1,64 @@ +package pr2.io.data_output.test; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import pr2.io.data_output.Board; +import pr2.io.data_output.Color; + +import java.io.FileOutputStream; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +/** + * Test. + */ +public class BoardTest { + + private static final byte[] RESULT = new byte[] { + 0x00, 0x0B, 0x53, 0x63, 0x68, 0x61, 0x63, 0x68, 0x62, 0x72, 0x65, + 0x74, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, + 0x00, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x04, 0x05, 0x00, 0x00, 0x00, 0x01, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, + 0x00, (byte) 0xff, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, + (byte) 0xFF, (byte) 0xFF + }; + + /** + * Test für die Implementierung des Spielbrettes. + * + * @throws IOException Datei-Probleme. + */ + @Test + void testDame() throws IOException { + Board s = new Board(); + s.set("a1", Color.BLACK); + s.set("b1", Color.WHITE); + s.set("h1", Color.BLACK); + s.set("h2", Color.BLACK); + s.set("a8", Color.BLACK); + s.set("f8", Color.BLACK); + s.set("f5", Color.WHITE); + s.set("e3", Color.WHITE); + s.set("g2", Color.WHITE); + + String stringRepresentation = s.toString(); + + s.writeToFile("/tmp/daten.dat"); + + s = Board.loadFromFile("/tmp/daten.dat"); + + assertEquals(stringRepresentation, s.toString()); + + FileOutputStream fos = new FileOutputStream("/tmp/testdata.dat"); + fos.write(RESULT); + fos.close(); + + s = Board.loadFromFile("/tmp/testdata.dat"); + + assertEquals(stringRepresentation, s.toString()); + } +} diff --git a/solutions/src/test/java/pr2/io/datei_schreiben/test/WriteDataTest.java b/solutions/src/test/java/pr2/io/datei_schreiben/test/WriteDataTest.java new file mode 100644 index 0000000..e50162d --- /dev/null +++ b/solutions/src/test/java/pr2/io/datei_schreiben/test/WriteDataTest.java @@ -0,0 +1,39 @@ +package pr2.io.datei_schreiben.test; + +import org.junit.jupiter.api.Test; +import pr2.io.datei_schreiben.WriteData; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +/** + * Test für die geschriebenen Daten. + */ +public class WriteDataTest { + + /** + * Geschriebene Daten testen. + * + * @throws IOException Datei-Probleme. + */ + @Test + void testData() throws IOException { + final String testFile = "/tmp/test.dat"; + + WriteData.main(new String[] { testFile }); + + InputStream is = new FileInputStream(testFile); + + byte[] buffer = new byte[10]; + is.read(buffer); + assertArrayEquals( + new byte[] {(byte) 0xca, (byte) 0xff, (byte) 0xfe, (byte) 0xba, + (byte) 0xbe, (byte) 0x00, (byte) 0xde, (byte) 0xad, + (byte) 0xbe, (byte) 0xef}, buffer); + + is.close(); + } +} diff --git a/solutions/src/test/java/pr2/io/filter/test/UCaseReaderTest.java b/solutions/src/test/java/pr2/io/filter/test/UCaseReaderTest.java new file mode 100644 index 0000000..9546c4a --- /dev/null +++ b/solutions/src/test/java/pr2/io/filter/test/UCaseReaderTest.java @@ -0,0 +1,34 @@ +package pr2.io.filter.test; + +import org.junit.jupiter.api.Test; +import pr2.io.filter.UCaseReader; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Test für die Rot13 "Verschlüsselung". + */ +public class UCaseReaderTest { + + /** + * Testmethode. + * + * @throws IOException IO-Probleme + */ + @Test + void testReader() throws IOException { + + BufferedReader br = new BufferedReader( + new UCaseReader(new StringReader( + "Dies ist" + " ein Test für den UCASE-Reader."))); + + String line = br.readLine(); + assertEquals("DIES IST EIN TEST FÜR DEN UCASE-READER.", line); + + br.close(); + } +} diff --git a/solutions/src/test/java/pr2/io/random_access/test/FileSortTest.java b/solutions/src/test/java/pr2/io/random_access/test/FileSortTest.java new file mode 100644 index 0000000..d5ac104 --- /dev/null +++ b/solutions/src/test/java/pr2/io/random_access/test/FileSortTest.java @@ -0,0 +1,62 @@ +package pr2.io.random_access.test; + +import org.junit.jupiter.api.Test; +import pr2.io.random_access.FileSort; + +import java.io.*; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Testet die Sortierung per Random-Access-File. + */ +public class FileSortTest { + + /** + * Kopiert die Datei f1 als Datei f2. + * + * @param f1 Quell-Datei + * @param f2 Ziel-Datei + * @throws IOException IO-Probleme + */ + private static void copyFile(String f1, String f2) throws IOException { + + FileInputStream fis = new FileInputStream(f1); + FileOutputStream fos = new FileOutputStream(f2); + + int b; + + while ((b = fis.read()) != -1) { + fos.write(b); + } + + fis.close(); + fos.close(); + } + + /** + * Testet die File-Sortierung. + * + * @throws IOException IO-Problem + */ + @Test + void testBubbleSort() throws IOException { + String path = getClass().getResource("data.dat").getFile(); + + copyFile(path, "/tmp/data.dat"); + FileSort.sortFile("/tmp/data.dat"); + + InputStream is = new FileInputStream("/tmp/data.dat"); + + int data; + byte lastByte = 0; + + while ((data = is.read()) >= 0) { + byte b = (byte) data; + assertTrue(b >= lastByte); + lastByte = b; + } + + is.close(); + } +} diff --git a/solutions/src/test/java/pr2/io/serialisierung/test/BoardTest.java b/solutions/src/test/java/pr2/io/serialisierung/test/BoardTest.java new file mode 100644 index 0000000..312d2bb --- /dev/null +++ b/solutions/src/test/java/pr2/io/serialisierung/test/BoardTest.java @@ -0,0 +1,42 @@ +package pr2.io.serialisierung.test; + +import org.junit.jupiter.api.Test; +import pr2.io.serialisierung.Board; +import pr2.io.serialisierung.Color; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Test. + */ +public class BoardTest { + + /** + * Test für die Implementierung des Spielbrettes. + * + * @throws IOException Datei-Probleme. + */ + @Test + void testDame() throws IOException { + Board s = new Board(); + s.set("a1", Color.BLACK); + s.set("b1", Color.WHITE); + s.set("h1", Color.BLACK); + s.set("h2", Color.BLACK); + s.set("a8", Color.BLACK); + s.set("f8", Color.BLACK); + s.set("f5", Color.WHITE); + s.set("e3", Color.WHITE); + s.set("g2", Color.WHITE); + + String stringRepresentation = s.toString(); + + s.writeToFile("/tmp/board.dat"); + + s = Board.loadFromFile("/tmp/board.dat"); + + assertEquals(stringRepresentation, s.toString()); + } +} diff --git a/solutions/src/test/java/pr2/lambda/matrixsuche/test/MatrixSucheTest.java b/solutions/src/test/java/pr2/lambda/matrixsuche/test/MatrixSucheTest.java new file mode 100644 index 0000000..f481817 --- /dev/null +++ b/solutions/src/test/java/pr2/lambda/matrixsuche/test/MatrixSucheTest.java @@ -0,0 +1,32 @@ +package pr2.lambda.matrixsuche.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.lambda.matrixsuche.MatrixSuche; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class MatrixSucheTest { + + @Test + void testSuche() { + + int[][] matrix = { + {3, 5, 6, 7, 8}, + {10, 12, 14, 16, 18}, + {23, 25, 26, 27, 28} + }; + + Assertions.assertEquals("(0, 1)", + MatrixSuche.findEntry(matrix, 5).toString()); + assertEquals("(2, 0)", + MatrixSuche.findEntry(matrix, 23).toString()); + assertEquals("(1, 2)", + MatrixSuche.findEntry(matrix, 14).toString()); + assertEquals("(0, 4)", + MatrixSuche.findEntry(matrix, 8).toString()); + assertNull( + MatrixSuche.findEntry(matrix, 99)); + } +} diff --git a/solutions/src/test/java/pr2/lambda/mogrifier_1/test/StringTransmogrifierTest.java b/solutions/src/test/java/pr2/lambda/mogrifier_1/test/StringTransmogrifierTest.java new file mode 100644 index 0000000..8b3bb4d --- /dev/null +++ b/solutions/src/test/java/pr2/lambda/mogrifier_1/test/StringTransmogrifierTest.java @@ -0,0 +1,33 @@ +package pr2.lambda.mogrifier_1.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.lambda.mogrifier_1.StringTransmogrifier; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class StringTransmogrifierTest { + + @Test + void testMogrification() { + String[] elements = {"Hello", "World"}; + + Assertions.assertArrayEquals(new String[] { "hello", "world"}, + StringTransmogrifier.transmogrify(elements, + String::toLowerCase)); + + assertArrayEquals(new String[] { "HELLO", "WORLD"}, + StringTransmogrifier.transmogrify(elements, + String::toUpperCase)); + + assertArrayEquals(new String[] { "Ifmmp", "Xpsme"}, + StringTransmogrifier.transmogrify(elements, + s -> { + char[] c = s.toCharArray(); + for (int i = 0; i < c.length; i++) { + c[i] = (char) (c[i] + 1); + } + return new String(c); + })); + } +} diff --git a/solutions/src/test/java/pr2/lambda/mogrifier_2/test/StringTransmogrifierTest.java b/solutions/src/test/java/pr2/lambda/mogrifier_2/test/StringTransmogrifierTest.java new file mode 100644 index 0000000..b842940 --- /dev/null +++ b/solutions/src/test/java/pr2/lambda/mogrifier_2/test/StringTransmogrifierTest.java @@ -0,0 +1,43 @@ +package pr2.lambda.mogrifier_2.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.lambda.mogrifier_2.StringFunction; +import pr2.lambda.mogrifier_2.StringTransmogrifier; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +public class StringTransmogrifierTest { + + static final String[] ELEMENTS = {"Hello", "World"}; + + @Test + void testMogrification() { + + + Assertions.assertArrayEquals(new String[] {"hello", "world"}, + StringTransmogrifier.transmogrify(ELEMENTS, + String::toLowerCase)); + + assertArrayEquals(new String[] {"HELLO", "WORLD"}, + StringTransmogrifier.transmogrify(ELEMENTS, + String::toUpperCase)); + + assertArrayEquals(new String[] {"Ifmmp", "Xpsme"}, + StringTransmogrifier.transmogrify(ELEMENTS, + s -> { + char[] c = s.toCharArray(); + for (int i = 0; i < c.length; i++) { + c[i] = (char) (c[i] + 1); + } + return new String(c); + })); + } + + @Test + void testCaesar() { + assertArrayEquals(new String[] {"Khoor", "Zruog"}, + StringTransmogrifier.transmogrify(ELEMENTS, + StringFunction.caesar(3))); + } +} diff --git a/solutions/src/test/java/pr2/lambda/observer/test/BeobachterTest.java b/solutions/src/test/java/pr2/lambda/observer/test/BeobachterTest.java new file mode 100644 index 0000000..24e643a --- /dev/null +++ b/solutions/src/test/java/pr2/lambda/observer/test/BeobachterTest.java @@ -0,0 +1,17 @@ +package pr2.lambda.observer.test; + +import org.junit.jupiter.api.Test; +import pr2.lambda.observer.Beobachter; +import pr2.lambda.observer.Datenhalter; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class BeobachterTest { + + @Test + void testBeobachter() { + Datenhalter dh = new Datenhalter(42); + Beobachter b = dh.getBeobachter(); + assertEquals(42, b.getValue()); + } +} diff --git a/solutions/src/test/java/pr2/object/clone_alien/test/AlienCloneTest.java b/solutions/src/test/java/pr2/object/clone_alien/test/AlienCloneTest.java new file mode 100644 index 0000000..4248732 --- /dev/null +++ b/solutions/src/test/java/pr2/object/clone_alien/test/AlienCloneTest.java @@ -0,0 +1,37 @@ +package pr2.object.clone_alien.test; + +import org.junit.jupiter.api.Test; +import pr2.object.clone_alien.Alien; +import pr2.object.clone_alien.Raumanzug; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; + +/** + * Test für die Clone-Methoden. + */ +public class AlienCloneTest { + + /** + * Test-Methode. + * + * @throws CloneNotSupportedException wird geworfen, wenn clone_alien + * nicht korrekt implementiert wurde. + */ + @Test + void testClone() throws CloneNotSupportedException { + Raumanzug r1 = new Raumanzug(); + Alien a1 = new Alien("Predator", r1); + + Alien a2 = (Alien) a1.clone(); + Raumanzug r2 = a2.getAnzug(); + + assertNotSame(a1, a2); + assertNotSame(r1, r2); + + assertEquals(a1, a2); + assertEquals(r1, r2); + assertEquals(r1.getSauerstoffVorrat(), r2.getSauerstoffVorrat(), + 0.0001); + } +} diff --git a/solutions/src/test/java/pr2/object/equals_hashcode/test/WesenTest.java b/solutions/src/test/java/pr2/object/equals_hashcode/test/WesenTest.java new file mode 100644 index 0000000..bdbe397 --- /dev/null +++ b/solutions/src/test/java/pr2/object/equals_hashcode/test/WesenTest.java @@ -0,0 +1,87 @@ +package pr2.object.equals_hashcode.test; + +import org.junit.jupiter.api.Test; +import pr2.object.equals_hashcode.Ork; +import pr2.object.equals_hashcode.Wesen; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; + +/** + * Testklasse für die Wesen. + */ +public class WesenTest { + + /** + * Testet equals und hashCode von Wesen. + */ + @Test + void testWesen() { + Wesen w1 = new Wesen("Azok", 30); + Wesen w2 = new Wesen("Azok", 30); + Wesen w3 = new Wesen("Azok", 31); + Wesen w4 = new Wesen("Gorrok", 30); + Wesen w5 = new Wesen("Gorrok", 31); + + assertNotSame(w1, w2); + assertEquals(w1, w2); + + assertNotSame(w1, w3); + assertNotEquals(w1, w3); + + assertNotSame(w1, w4); + assertNotEquals(w1, w4); + + assertNotSame(w1, w5); + assertNotEquals(w1, w5); + + assertEquals(w1.hashCode(), w2.hashCode()); + } + + /** + * Testet equals und hashCode von Ork. + */ + @Test + void testOrk() { + Ork o1 = new Ork("Snagas", true); + Ork o2 = new Ork("Snagas", true); + Ork o3 = new Ork("Snagas", false); + Ork o4 = new Ork("Berg-Ork", false); + Ork o5 = new Ork("Berg-Ork", true); + Ork o6 = new Ork("Berg-Ork", false); + Wesen w = new Wesen("Snagas", 17); + + assertNotSame(o1, o2); + assertEquals(o1, o2); + + assertNotSame(o1, o3); + assertNotEquals(o1, o3); + + assertNotSame(o1, o4); + assertNotEquals(o1, o4); + + assertNotSame(o1, o5); + assertNotEquals(o1, o5); + + assertEquals(o1.hashCode(), o2.hashCode()); + assertEquals(o4.hashCode(), o6.hashCode()); + + assertNotEquals(w, o1); + assertNotEquals(w, o2); + assertNotEquals(w, o3); + assertNotEquals(null, o1); + assertNotEquals("Hugo", o1); + assertEquals(o1, o1); + + // Diese Tests muss nicht zwangsweise funktionieren, da + // ungleiche Objekte einen identischen Hashcode haben können. + // Wir gehen hier aber davon aus, dass eine Hashkollision + // sehr selten ist und machen daher aus didaktischen Gründen + // diesen Test. + assertNotEquals(o1.hashCode(), o3.hashCode()); + assertNotEquals(o1.hashCode(), o4.hashCode()); + assertNotEquals(o1.hashCode(), o5.hashCode()); + assertNotEquals(o4.hashCode(), o5.hashCode()); + } +} diff --git a/solutions/src/test/java/pr2/streams/chars_1/test/CountLettersTest.java b/solutions/src/test/java/pr2/streams/chars_1/test/CountLettersTest.java new file mode 100644 index 0000000..963c9ca --- /dev/null +++ b/solutions/src/test/java/pr2/streams/chars_1/test/CountLettersTest.java @@ -0,0 +1,16 @@ +package pr2.streams.chars_1.test; + +import org.junit.jupiter.api.Test; +import pr2.streams.chars_1.CountLetters; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CountLettersTest { + @Test + void testCount() { + String s = "Dies ist ein String mit einer ganzen Reihe von " + + "Buchstaben."; + + assertEquals(44, CountLetters.count(s)); + } +} diff --git a/solutions/src/test/java/pr2/streams/chars_2/test/CountLettersTest.java b/solutions/src/test/java/pr2/streams/chars_2/test/CountLettersTest.java new file mode 100644 index 0000000..462bde7 --- /dev/null +++ b/solutions/src/test/java/pr2/streams/chars_2/test/CountLettersTest.java @@ -0,0 +1,19 @@ +package pr2.streams.chars_2.test; + +import org.junit.jupiter.api.Test; +import pr2.streams.chars_2.CountLetters; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CountLettersTest { + @Test + void testCount() { + List liste = Arrays.asList("Hallo", "Welt", "wie", "geht", + "es"); + + assertEquals(18, CountLetters.count(liste)); + } +} diff --git a/solutions/src/test/java/pr2/streams/chars_3/test/CountLettersTest.java b/solutions/src/test/java/pr2/streams/chars_3/test/CountLettersTest.java new file mode 100644 index 0000000..f547780 --- /dev/null +++ b/solutions/src/test/java/pr2/streams/chars_3/test/CountLettersTest.java @@ -0,0 +1,19 @@ +package pr2.streams.chars_3.test; + +import org.junit.jupiter.api.Test; +import pr2.streams.chars_3.CountLetters; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CountLettersTest { + @Test + void testCount() { + List liste = Arrays.asList("Hallo", "Welt", "wie", "geht", + "es"); + + assertEquals(16, CountLetters.count(liste)); + } +} diff --git a/solutions/src/test/java/pr2/streams/filter/test/FilterListTest.java b/solutions/src/test/java/pr2/streams/filter/test/FilterListTest.java new file mode 100644 index 0000000..a807aec --- /dev/null +++ b/solutions/src/test/java/pr2/streams/filter/test/FilterListTest.java @@ -0,0 +1,25 @@ +package pr2.streams.filter.test; + +import org.junit.jupiter.api.Test; +import pr2.streams.filter.FilterList; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class FilterListTest { + + @Test + void testFilter() { + List liste = Arrays.asList( + "Hallo", "Welt", "Dampfschifffahrt", "Hundekuchen", + "Fiction", "Java", "Visual Basic", "Drucker"); + + List result = Arrays.asList( + "hallo", "dampfschifffahrt", "hundekuchen", + "fiction", "visual basic", "drucker"); + + assertEquals(result, FilterList.filter(liste)); + } +} diff --git a/solutions/src/test/java/pr2/streams/reduce/test/SquarerTest.java b/solutions/src/test/java/pr2/streams/reduce/test/SquarerTest.java new file mode 100644 index 0000000..638f9c2 --- /dev/null +++ b/solutions/src/test/java/pr2/streams/reduce/test/SquarerTest.java @@ -0,0 +1,26 @@ +package pr2.streams.reduce.test; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pr2.streams.reduce.Squarer; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SquarerTest { + + @Test + void testMitMap() { + List l = Arrays.asList(1, 5, 8, 9, 12, 10, 3); + Assertions.assertEquals(424, Squarer.mitMap(l)); + } + + @Test + void testOhneMap() { + List l = Arrays.asList(1, 5, 8, 9, 12, 10, 3); + assertEquals(424, Squarer.ohneMap(l)); + } + +} diff --git a/solutions/src/test/java/pr2/streams/summieren/test/SumUpTest.java b/solutions/src/test/java/pr2/streams/summieren/test/SumUpTest.java new file mode 100644 index 0000000..bec5b46 --- /dev/null +++ b/solutions/src/test/java/pr2/streams/summieren/test/SumUpTest.java @@ -0,0 +1,18 @@ +package pr2.streams.summieren.test; + +import org.junit.jupiter.api.Test; +import pr2.streams.summieren.SumUp; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SumUpTest { + + @Test + void testSum() { + List l = Arrays.asList(1, 5, 8, 9, 12, 10, 3); + assertEquals(48, SumUp.sumUp(l.stream())); + } +} diff --git a/solutions/src/test/java/pr2/streams/word_count/test/WordCountTest.java b/solutions/src/test/java/pr2/streams/word_count/test/WordCountTest.java new file mode 100644 index 0000000..43dbcf8 --- /dev/null +++ b/solutions/src/test/java/pr2/streams/word_count/test/WordCountTest.java @@ -0,0 +1,21 @@ +package pr2.streams.word_count.test; + +import org.junit.jupiter.api.Test; +import pr2.streams.word_count.WordCount; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class WordCountTest { + + @Test + void testWordCount() { + List liste = Arrays.asList("A", "A", "B", "B", "B", "C", + "D", "D", "E", "E", "E", "F"); + + assertEquals(Arrays.asList("A->2", "B->3", "C->1", "D->2", + "E->3", "F->1"), WordCount.count(liste)); + } +} diff --git a/solutions/src/test/java/pr2/vererbung/konstruktoren/test/WesenTest.java b/solutions/src/test/java/pr2/vererbung/konstruktoren/test/WesenTest.java new file mode 100644 index 0000000..3587cf9 --- /dev/null +++ b/solutions/src/test/java/pr2/vererbung/konstruktoren/test/WesenTest.java @@ -0,0 +1,47 @@ +package pr2.vererbung.konstruktoren.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.konstruktoren.Nachtelf; +import pr2.vererbung.konstruktoren.Untoter; +import pr2.vererbung.konstruktoren.Wesen; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Test für die Aufgabe. + */ +public class WesenTest { + + /** + * Testet den Nachtelf. + */ + @Test + void testNachtelf() { + assertTrue(new Nachtelf("") instanceof Wesen, + "Nachtelf erbt nicht " + "von Wesen"); + + assertEquals(Nachtelf.STANDARD_NATURWIDERSTAND, + new Nachtelf("").getNaturwiderstand()); + + assertEquals(120, new Nachtelf("", 120).getNaturwiderstand()); + + assertEquals("Hugo", new Nachtelf("Hugo").getName()); + } + + /** + * Testet den Untoten. + */ + @Test + void testUntoten() { + assertTrue(new Untoter("") instanceof Wesen, + "Untoter erbt nicht von " + "Wesen"); + + assertEquals(Untoter.STANDARD_UNTERWASSERATMUNG, + new Untoter("").getUnterwasseratmung()); + + assertEquals(120, new Untoter("", 120).getUnterwasseratmung()); + + assertEquals("Hugo", new Untoter("Hugo").getName()); + } +} diff --git a/solutions/src/test/java/pr2/vererbung/ueberladen_summe/SummatorTest.java b/solutions/src/test/java/pr2/vererbung/ueberladen_summe/SummatorTest.java new file mode 100644 index 0000000..77ac6ef --- /dev/null +++ b/solutions/src/test/java/pr2/vererbung/ueberladen_summe/SummatorTest.java @@ -0,0 +1,26 @@ +package pr2.vererbung.ueberladen_summe; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.ueberladen_summe.Summator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SummatorTest { + + @Test + void testSum() { + Summator s = new Summator(); + assertEquals(3, s.sum(1, 2)); + assertEquals(1, s.sum(-1, 2)); + assertEquals(6, s.sum(1, 2, 3)); + assertEquals(0, s.sum(1, 2, -3)); + assertEquals(10, s.sum(1, 2, 3, 4)); + assertEquals(2, s.sum(1, 2, 3, -4)); + assertEquals(15, s.sum(1, 2, 3, 4, 5)); + assertEquals(5, s.sum(1, 2, 3, 4, -5)); + assertEquals(0, s.sum(0, 0)); + assertEquals(0, s.sum(0, 0, 0)); + assertEquals(0, s.sum(0, 0, 0, 0)); + assertEquals(0, s.sum(0, 0,0, 0, 0)); + } +} diff --git a/solutions/src/test/java/pr2/vererbung/ueberladen_summe/test/SummatorTest.java b/solutions/src/test/java/pr2/vererbung/ueberladen_summe/test/SummatorTest.java new file mode 100644 index 0000000..d20882e --- /dev/null +++ b/solutions/src/test/java/pr2/vererbung/ueberladen_summe/test/SummatorTest.java @@ -0,0 +1,22 @@ +package pr2.vererbung.ueberladen_summe.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.ueberladen_summe.Summator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SummatorTest { + + @Test + void testSum() { + Summator s = new Summator(); + assertEquals(3, s.sum(1, 2)); + assertEquals(1, s.sum(-1, 2)); + assertEquals(6, s.sum(1, 2, 3)); + assertEquals(0, s.sum(1, 2, -3)); + assertEquals(10, s.sum(1, 2, 3, 4)); + assertEquals(2, s.sum(1, 2, 3, -4)); + assertEquals(15, s.sum(1, 2, 3, 4, 5)); + assertEquals(5, s.sum(1, 2, 3, 4, -5)); + } +} diff --git a/solutions/src/test/java/pr2/vererbung/vararg_summe/SummatorTest.java b/solutions/src/test/java/pr2/vererbung/vararg_summe/SummatorTest.java new file mode 100644 index 0000000..33b55c4 --- /dev/null +++ b/solutions/src/test/java/pr2/vererbung/vararg_summe/SummatorTest.java @@ -0,0 +1,23 @@ +package pr2.vererbung.vararg_summe; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.vararg_summe.Summator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SummatorTest { + + @Test + void testSum() { + Summator s = new Summator(); + assertEquals(3, s.sum(1, 2)); + assertEquals(1, s.sum(-1, 2)); + assertEquals(6, s.sum(1, 2, 3)); + assertEquals(0, s.sum(1, 2, -3)); + assertEquals(10, s.sum(1, 2, 3, 4)); + assertEquals(2, s.sum(1, 2, 3, -4)); + assertEquals(15, s.sum(1, 2, 3, 4, 5)); + assertEquals(5, s.sum(1, 2, 3, 4, -5)); + assertEquals(36, s.sum(1, 2, 3, 4, 5, 6, 7, 8)); + } +} diff --git a/solutions/src/test/java/pr2/vererbung/vararg_summe/test/SummatorTest.java b/solutions/src/test/java/pr2/vererbung/vararg_summe/test/SummatorTest.java new file mode 100644 index 0000000..93aba84 --- /dev/null +++ b/solutions/src/test/java/pr2/vererbung/vararg_summe/test/SummatorTest.java @@ -0,0 +1,23 @@ +package pr2.vererbung.vararg_summe.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.vararg_summe.Summator; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SummatorTest { + + @Test + void testSum() { + Summator s = new Summator(); + assertEquals(3, s.sum(1, 2)); + assertEquals(1, s.sum(-1, 2)); + assertEquals(6, s.sum(1, 2, 3)); + assertEquals(0, s.sum(1, 2, -3)); + assertEquals(10, s.sum(1, 2, 3, 4)); + assertEquals(2, s.sum(1, 2, 3, -4)); + assertEquals(15, s.sum(1, 2, 3, 4, 5)); + assertEquals(5, s.sum(1, 2, 3, 4, -5)); + assertEquals(36, s.sum(1, 2, 3, 4, 5, 6, 7, 8)); + } +} diff --git a/solutions/src/test/java/pr2/vererbung/vererbung_geometrie/FigurenTest.java b/solutions/src/test/java/pr2/vererbung/vererbung_geometrie/FigurenTest.java new file mode 100644 index 0000000..430d7fa --- /dev/null +++ b/solutions/src/test/java/pr2/vererbung/vererbung_geometrie/FigurenTest.java @@ -0,0 +1,67 @@ +package pr2.vererbung.vererbung_geometrie; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.vererbung_geometrie.Dreieck; +import pr2.vererbung.vererbung_geometrie.Gerade; +import pr2.vererbung.vererbung_geometrie.Quadrat; +import pr2.vererbung.vererbung_geometrie.Rechteck; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Tests für die Figuren. + */ +public class FigurenTest { + + private static final double PRECISION = 0.0001; + + /** + * Rechteck. + */ + @Test + void testReckteck() { + Rechteck r1 = new Rechteck(4.0, 5.0); + Rechteck r2 = new Rechteck(0.0, 3.0); + assertEquals(20.0, r1.getFlaeche(), PRECISION); + assertEquals(0.0, r2.getFlaeche(), PRECISION); + } + + /** + * Dreieck. + */ + @Test + void testDreieck() { + Dreieck d1 = new Dreieck(6.0, 3.5); + assertEquals(10.5, d1.getFlaeche(), PRECISION); + } + + /** + * Gerade. + */ + @Test + void testGerade() { + Gerade g1 = new Gerade(8.0); + assertEquals(8.0, g1.getLaenge(), PRECISION); + assertEquals(0.0, g1.getFlaeche(), PRECISION); + + g1 = new Gerade(0.0); + assertEquals(0.0, g1.getLaenge(), PRECISION); + assertEquals(0.0, g1.getFlaeche(), PRECISION); + } + + /** + * Quadrat. + */ + @Test + void testQuadrat() { + Quadrat q1 = new Quadrat(3.0); + assertEquals(9.0, q1.getFlaeche(), PRECISION); + + Rechteck r1 = new Rechteck(5.0, 5.0); + Quadrat q2 = new Quadrat(5.0); + assertEquals(r1.getFlaeche(), q2.getFlaeche(), PRECISION); + + q1 = new Quadrat(0.0); + assertEquals(0.0, q1.getFlaeche(), PRECISION); + } +} diff --git a/solutions/src/test/java/pr2/vererbung/vererbung_geometrie/test/FigurenTest.java b/solutions/src/test/java/pr2/vererbung/vererbung_geometrie/test/FigurenTest.java new file mode 100644 index 0000000..446402d --- /dev/null +++ b/solutions/src/test/java/pr2/vererbung/vererbung_geometrie/test/FigurenTest.java @@ -0,0 +1,67 @@ +package pr2.vererbung.vererbung_geometrie.test; + +import org.junit.jupiter.api.Test; +import pr2.vererbung.vererbung_geometrie.Dreieck; +import pr2.vererbung.vererbung_geometrie.Gerade; +import pr2.vererbung.vererbung_geometrie.Quadrat; +import pr2.vererbung.vererbung_geometrie.Rechteck; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Tests für die Figuren. + */ +public class FigurenTest { + + private static final double PRECISION = 0.0001; + + /** + * Rechteck. + */ + @Test + void testReckteck() { + Rechteck r1 = new Rechteck(4.0, 5.0); + Rechteck r2 = new Rechteck(0.0, 3.0); + assertEquals(20.0, r1.getFlaeche(), PRECISION); + assertEquals(0.0, r2.getFlaeche(), PRECISION); + } + + /** + * Dreieck. + */ + @Test + void testDreieck() { + Dreieck d1 = new Dreieck(6.0, 3.5); + assertEquals(10.5, d1.getFlaeche(), PRECISION); + } + + /** + * Gerade. + */ + @Test + void testGerade() { + Gerade g1 = new Gerade(8.0); + assertEquals(8.0, g1.getLaenge(), PRECISION); + assertEquals(0.0, g1.getFlaeche(), PRECISION); + + g1 = new Gerade(0.0); + assertEquals(0.0, g1.getLaenge(), PRECISION); + assertEquals(0.0, g1.getFlaeche(), PRECISION); + } + + /** + * Quadrat. + */ + @Test + void testQuadrat() { + Quadrat q1 = new Quadrat(3.0); + assertEquals(9.0, q1.getFlaeche(), PRECISION); + + Rechteck r1 = new Rechteck(5.0, 5.0); + Quadrat q2 = new Quadrat(5.0); + assertEquals(r1.getFlaeche(), q2.getFlaeche(), PRECISION); + + q1 = new Quadrat(0.0); + assertEquals(0.0, q1.getFlaeche(), PRECISION); + } +} diff --git a/sources/src/main/java/pr2/io/data_output/Board.java b/sources/src/main/java/pr2/io/data_output/Board.java index cd22de2..dc71c72 100644 --- a/sources/src/main/java/pr2/io/data_output/Board.java +++ b/sources/src/main/java/pr2/io/data_output/Board.java @@ -28,7 +28,7 @@ public class Board { Board result = new Board(); - // TODO: Daten aus Datei lesen + // TODO: Daten aus Datei lesen. // TODO: Zuerst überprüfen, ob Datei mit "Schachbrett" anfängt, wenn nein, Ausnahme werfen // TODO: Positionen und Farbe der Figuren einlesen