From 35e0d54194118d0ca1c3633f91f561d8441a09a4 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 5 Jul 2021 19:38:48 +0300 Subject: [PATCH 01/50] First commit --- gradlew | 2 +- gradlew.bat | 21 ++++++++++++++++++--- src/main/java/Main.java | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 index 4f906e0c..fbd7c515 --- a/gradlew +++ b/gradlew @@ -130,7 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 107acd32..5093609d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if "%ERRORLEVEL%" == "0" goto init echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto execute +if exist "%JAVA_EXE%" goto init echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,6 +64,21 @@ echo location of your Java installation. goto fail +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + :execute @rem Setup the command line @@ -71,7 +86,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 9f28e436..33b0db62 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,7 +1,7 @@ public class Main { public static void main(String[] args) { - System.out.println("Hello, World!"); + System.out.println("Hello, World"); } } From a2500dab3d842ae50256da5e29f79ff6b68a0d9c Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 5 Jul 2021 20:03:41 +0300 Subject: [PATCH 02/50] Add new gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8a0a60d2..2b1fb1b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ # Project exclude paths /.gradle/ /build/ -/build/classes/java/main/ \ No newline at end of file +/build/classes/java/main/ +/.idea/ +/gradle/ +/.DS_Store/ \ No newline at end of file From b52fdb327b5da0510b3e3ab354a6118bc04e792e Mon Sep 17 00:00:00 2001 From: vrodina Date: Wed, 7 Jul 2021 01:43:31 +0300 Subject: [PATCH 03/50] Add homework1 task --- src/main/java/Main.java | 7 ------- src/main/java/homework1/Main.java | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/Main.java create mode 100644 src/main/java/homework1/Main.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java deleted file mode 100644 index 33b0db62..00000000 --- a/src/main/java/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -public class Main { - - public static void main(String[] args) { - System.out.println("Hello, World"); - } - -} diff --git a/src/main/java/homework1/Main.java b/src/main/java/homework1/Main.java new file mode 100644 index 00000000..fef9e333 --- /dev/null +++ b/src/main/java/homework1/Main.java @@ -0,0 +1,15 @@ +public class Main { + + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_RED = "\u001B[31m"; + + public static void main(String[] args) { + for (String arg : args) { + if (arg.equals("error")) { + System.out.println(ANSI_RED + "Alarm!" + ANSI_RESET); + break; + } + System.out.println(arg + ": " + arg.length() + " letters"); + } + } +} From ff1a0c0ffd8d16f00c2a7b3a2d91bfa39db16b34 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 12 Jul 2021 18:13:16 +0300 Subject: [PATCH 04/50] Add homework1 task Renaming the branch --- src/main/java/homework1/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/homework1/Main.java b/src/main/java/homework1/Main.java index fef9e333..826aa6a9 100644 --- a/src/main/java/homework1/Main.java +++ b/src/main/java/homework1/Main.java @@ -5,7 +5,7 @@ public class Main { public static void main(String[] args) { for (String arg : args) { - if (arg.equals("error")) { + if ("error".equals(arg)) { System.out.println(ANSI_RED + "Alarm!" + ANSI_RESET); break; } From 78b2f08ad4b11038cfb732dc0a05b8ae1b3285c6 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 12 Jul 2021 18:32:53 +0300 Subject: [PATCH 05/50] Change a structure of project --- src/main/java/{homework1 => homework_1}/Main.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename src/main/java/{homework1 => homework_1}/Main.java (93%) diff --git a/src/main/java/homework1/Main.java b/src/main/java/homework_1/Main.java similarity index 93% rename from src/main/java/homework1/Main.java rename to src/main/java/homework_1/Main.java index 826aa6a9..8f615c6b 100644 --- a/src/main/java/homework1/Main.java +++ b/src/main/java/homework_1/Main.java @@ -1,3 +1,5 @@ +package homework_1; + public class Main { public static final String ANSI_RESET = "\u001B[0m"; @@ -9,7 +11,7 @@ public static void main(String[] args) { System.out.println(ANSI_RED + "Alarm!" + ANSI_RESET); break; } - System.out.println(arg + ": " + arg.length() + " letters"); + System.out.println(arg + ": " + arg.length() + " letter/s"); } } } From 463cebd4fe2e82e46e71dbfe17fe1a1f73322e6e Mon Sep 17 00:00:00 2001 From: vrodina Date: Tue, 13 Jul 2021 21:54:26 +0300 Subject: [PATCH 06/50] Update after review --- gradlew | 2 +- gradlew.bat | 21 +++------------------ 2 files changed, 4 insertions(+), 19 deletions(-) mode change 100755 => 100644 gradlew diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 index fbd7c515..4f906e0c --- a/gradlew +++ b/gradlew @@ -130,7 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 5093609d..107acd32 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,21 +64,6 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line @@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From 44075341e9d2871d1b549108fbf47f12003214c9 Mon Sep 17 00:00:00 2001 From: vrodina Date: Thu, 15 Jul 2021 01:38:35 +0300 Subject: [PATCH 07/50] Add PyramidPrinter task for homework_2 --- src/main/java/homework_2/PyramidPrinter.java | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/homework_2/PyramidPrinter.java diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/PyramidPrinter.java new file mode 100644 index 00000000..2261425c --- /dev/null +++ b/src/main/java/homework_2/PyramidPrinter.java @@ -0,0 +1,25 @@ +package homework_2; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class PyramidPrinter { + public static void main(String[] args) throws Exception { + printPyramid(); + } + + private static void printPyramid() throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + System.out.println("Please type a positive integer number"); + int levelsOfPyramid = Integer.parseInt(reader.readLine()); + for (int i = 1; i <= levelsOfPyramid; i++) { + for (int j = 1; j <= i; j++) { + System.out.print("x"); + } + System.out.println(); + } + } + } + +} From 8be4005bfc8a62cf7b74d82a8405ac8f02102443 Mon Sep 17 00:00:00 2001 From: vrodina Date: Fri, 16 Jul 2021 02:32:38 +0300 Subject: [PATCH 08/50] Add RandomCharsTable task for homework_2 --- .../java/homework_2/RandomCharsTable.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/homework_2/RandomCharsTable.java diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java new file mode 100644 index 00000000..5a1c9fc8 --- /dev/null +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -0,0 +1,32 @@ +package homework_2; + +import java.io.IOException; +import java.util.Scanner; + +public class RandomCharsTable { + public static void main(String[] args) { + randomCharsTable(); + } + + private static void randomCharsTable() { + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Please type size of a table: 2 numbers and strategy: even or odd"); + + int lengthOfTable = scanner.nextInt(); + int widthOfTable = scanner.nextInt(); + String strategy = scanner.next(); + + char[][] randomCharsTable = new char[lengthOfTable][widthOfTable]; + + int min = 'A'; + int max = 'Z'; + for (int i = 0; i < lengthOfTable; i++) { + for (int j = 0; j < widthOfTable; j++) { + randomCharsTable[i][j] = (char) ((int) (Math.random() * (max - min + 1) + min)); + System.out.print(randomCharsTable[i][j] + " "); + } + System.out.println(); + } + } + } +} From 6105e3a515104b0445fac71e4b1f760286b12adf Mon Sep 17 00:00:00 2001 From: vrodina Date: Fri, 16 Jul 2021 18:13:40 +0300 Subject: [PATCH 09/50] Add RandomCharsTable task for homework_2 --- .../java/homework_2/RandomCharsTable.java | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java index 5a1c9fc8..c4347017 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -1,6 +1,5 @@ package homework_2; -import java.io.IOException; import java.util.Scanner; public class RandomCharsTable { @@ -18,15 +17,46 @@ private static void randomCharsTable() { char[][] randomCharsTable = new char[lengthOfTable][widthOfTable]; - int min = 'A'; - int max = 'Z'; + int minRand = 'A'; + int maxRand = 'Z'; for (int i = 0; i < lengthOfTable; i++) { for (int j = 0; j < widthOfTable; j++) { - randomCharsTable[i][j] = (char) ((int) (Math.random() * (max - min + 1) + min)); - System.out.print(randomCharsTable[i][j] + " "); + randomCharsTable[i][j] = (char) ((int) (Math.random() * (maxRand - minRand + 1) + minRand)); + System.out.print(" | " + randomCharsTable[i][j] + " |"); } System.out.println(); } + + if ("even".equals(strategy.toLowerCase())) { + System.out.print("Even letters: "); + } + + if ("odd".equals(strategy.toLowerCase())) { + System.out.print("Odd letters: "); + } + + StringBuffer stringBuffer = new StringBuffer(); + + for (int i = 0; i < lengthOfTable; i++) { + for (int j = 0; j < widthOfTable; j++) { + int codeOfChar = randomCharsTable[i][j]; + if ("even".equals(strategy.toLowerCase())) { + if (codeOfChar % 2 == 0) { + stringBuffer.append(" ").append((char) codeOfChar).append(" ,"); + } + } + + if ("odd".equals(strategy.toLowerCase())) { + if (codeOfChar % 2 != 0) { + stringBuffer.append(" ").append((char) codeOfChar).append(" ,"); + } + } + } + } + + stringBuffer.deleteCharAt(stringBuffer.length() - 1); + + System.out.print(stringBuffer); } } } From 87d92db92245f9e431ef0b7733b9e0d23f4f4ff0 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sat, 17 Jul 2021 02:33:41 +0300 Subject: [PATCH 10/50] Refactor PyramidPrinter and RandomCharsTable tasks, add TrafficLight task --- src/main/java/homework_2/PyramidPrinter.java | 4 +- .../java/homework_2/RandomCharsTable.java | 9 ++- src/main/java/homework_2/TrafficLight.java | 55 +++++++++++++++++++ 3 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/main/java/homework_2/TrafficLight.java diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/PyramidPrinter.java index 2261425c..03c70d3f 100644 --- a/src/main/java/homework_2/PyramidPrinter.java +++ b/src/main/java/homework_2/PyramidPrinter.java @@ -11,7 +11,7 @@ public static void main(String[] args) throws Exception { private static void printPyramid() throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - System.out.println("Please type a positive integer number"); + System.out.println("Please type a positive integer number:"); int levelsOfPyramid = Integer.parseInt(reader.readLine()); for (int i = 1; i <= levelsOfPyramid; i++) { for (int j = 1; j <= i; j++) { @@ -19,6 +19,8 @@ private static void printPyramid() throws IOException { } System.out.println(); } + } catch (NumberFormatException e) { + throw new RuntimeException(e); } } diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java index c4347017..c56d07f3 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -1,15 +1,16 @@ package homework_2; +import java.io.IOException; import java.util.Scanner; public class RandomCharsTable { - public static void main(String[] args) { + public static void main(String[] args) throws IllegalArgumentException { randomCharsTable(); } - private static void randomCharsTable() { + private static void randomCharsTable() throws IllegalArgumentException { try (Scanner scanner = new Scanner(System.in)) { - System.out.println("Please type size of a table: 2 numbers and strategy: even or odd"); + System.out.println("Please type size of a table: 2 numbers and strategy - even or odd:"); int lengthOfTable = scanner.nextInt(); int widthOfTable = scanner.nextInt(); @@ -57,6 +58,8 @@ private static void randomCharsTable() { stringBuffer.deleteCharAt(stringBuffer.length() - 1); System.out.print(stringBuffer); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); } } } diff --git a/src/main/java/homework_2/TrafficLight.java b/src/main/java/homework_2/TrafficLight.java new file mode 100644 index 00000000..9ed45932 --- /dev/null +++ b/src/main/java/homework_2/TrafficLight.java @@ -0,0 +1,55 @@ +package homework_2; + +import java.util.Scanner; + +public class TrafficLight { + + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + + public static void main(String[] args) { + trafficLight(); + } + + private static void trafficLight() { + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Please type your current time (in hh:mm:ss format):"); + String str = scanner.nextLine(); + String[] arr; + + if (str.matches("\\d\\d:\\d\\d:\\d\\d")) { + arr = str.split(":"); + int hoursSec = Integer.parseInt(arr[0]) * 60 * 60; + int minutesSec = Integer.parseInt(arr[1]) * 60; + int secondsSec = Integer.parseInt(arr[2]); + + if (hoursSec < 0 || minutesSec < 0 || secondsSec < 0) { + System.out.println("Please type positive numbers"); + } + if (hoursSec > 24 * 60 * 60 || minutesSec > 60 * 60 || secondsSec >= 60) { + System.out.println("Unfortunately this day has already finished"); + } + + int timeInSeconds = secondsSec + minutesSec * 60 + hoursSec * 60 * 60; + int cycleOfTrafficLight = 60; + int secForLight = timeInSeconds % cycleOfTrafficLight; + + if (secForLight >= 0 && secForLight < 35) { + System.out.println(ANSI_GREEN + "GREEN" + ANSI_RESET); + } + if (secForLight >= 35 && secForLight < 40 || secForLight >= 55) { + System.out.println(ANSI_YELLOW + "YELLOW" + ANSI_RESET); + } + if (secForLight >= 40 && secForLight < 55) { + System.out.println(ANSI_RED + "RED" + ANSI_RESET); + } + } else { + System.out.println("Wrong format. Please type your current time as HH:MM:SS"); + } + } catch (NumberFormatException e) { + throw new RuntimeException(e); + } + } +} From aa82415d3e2fef1c530c282d57d580a59ff8a1ae Mon Sep 17 00:00:00 2001 From: vrodina Date: Sat, 17 Jul 2021 02:50:57 +0300 Subject: [PATCH 11/50] Update README --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 8eb336cb..52794a70 100644 --- a/README.md +++ b/README.md @@ -5,5 +5,9 @@ | Number | Solution | Short description | --- | --- | --- | | HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_1) | The app that reads input arguments and prints them, until "error" argument | +| HW2_1 | [Traffic light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2) | The app that reads the number of seconds from the beginning of the day from the command line displays the color of the traffic light (green, yellow or red) | +| HW2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2) | The app that reads the number from the command line and print a pyramid with levels according to this number, this pyramid consists only of 'x' symbols | +| HW2_3 | [Random chars table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2) | The app that reads 2 numbers as size of a table and a strategy: even or odd, print this table consisting of random symbols from A to Z and then print all symbols in one line which are odd or even according to the strategy (their ASCII codes) | +| [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From 412219dfccc2a88b87c9b08e944b7ae5d0901c14 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sat, 17 Jul 2021 03:52:51 +0300 Subject: [PATCH 12/50] Fix all 3 tasks --- src/main/java/homework_2/PyramidPrinter.java | 20 +++++++++++-------- .../java/homework_2/RandomCharsTable.java | 9 +++++---- src/main/java/homework_2/TrafficLight.java | 14 ++++++------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/PyramidPrinter.java index 03c70d3f..55672f84 100644 --- a/src/main/java/homework_2/PyramidPrinter.java +++ b/src/main/java/homework_2/PyramidPrinter.java @@ -5,21 +5,25 @@ import java.io.InputStreamReader; public class PyramidPrinter { - public static void main(String[] args) throws Exception { + public static void main(String[] args) { printPyramid(); } - private static void printPyramid() throws IOException { + private static void printPyramid() { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.println("Please type a positive integer number:"); - int levelsOfPyramid = Integer.parseInt(reader.readLine()); - for (int i = 1; i <= levelsOfPyramid; i++) { - for (int j = 1; j <= i; j++) { - System.out.print("x"); + try { + int levelsOfPyramid = Integer.parseInt(reader.readLine()); + for (int i = 1; i <= levelsOfPyramid; i++) { + for (int j = 1; j <= i; j++) { + System.out.print("x"); + } + System.out.println(); } - System.out.println(); + } catch (NumberFormatException e) { + System.out.println("You typed not a number, please add a positive number"); } - } catch (NumberFormatException e) { + } catch (IOException e) { throw new RuntimeException(e); } } diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java index c56d07f3..739fc6c6 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -1,14 +1,15 @@ package homework_2; import java.io.IOException; +import java.util.InputMismatchException; import java.util.Scanner; public class RandomCharsTable { - public static void main(String[] args) throws IllegalArgumentException { + public static void main(String[] args) { randomCharsTable(); } - private static void randomCharsTable() throws IllegalArgumentException { + private static void randomCharsTable() { try (Scanner scanner = new Scanner(System.in)) { System.out.println("Please type size of a table: 2 numbers and strategy - even or odd:"); @@ -58,8 +59,8 @@ private static void randomCharsTable() throws IllegalArgumentException { stringBuffer.deleteCharAt(stringBuffer.length() - 1); System.out.print(stringBuffer); - } catch (IllegalArgumentException e) { - throw new RuntimeException(e); + } catch (InputMismatchException e) { + System.out.println("Please follow to the correct format: 2 numbers + even/odd word"); } } } diff --git a/src/main/java/homework_2/TrafficLight.java b/src/main/java/homework_2/TrafficLight.java index 9ed45932..9d3289aa 100644 --- a/src/main/java/homework_2/TrafficLight.java +++ b/src/main/java/homework_2/TrafficLight.java @@ -23,16 +23,14 @@ private static void trafficLight() { arr = str.split(":"); int hoursSec = Integer.parseInt(arr[0]) * 60 * 60; int minutesSec = Integer.parseInt(arr[1]) * 60; - int secondsSec = Integer.parseInt(arr[2]); + int seconds = Integer.parseInt(arr[2]); - if (hoursSec < 0 || minutesSec < 0 || secondsSec < 0) { - System.out.println("Please type positive numbers"); - } - if (hoursSec > 24 * 60 * 60 || minutesSec > 60 * 60 || secondsSec >= 60) { - System.out.println("Unfortunately this day has already finished"); + if (hoursSec > 24 * 60 * 60 || minutesSec > 60 * 60 || seconds >= 60) { + System.out.println("Unfortunately this day has already finished, please check"); + return; } - int timeInSeconds = secondsSec + minutesSec * 60 + hoursSec * 60 * 60; + int timeInSeconds = seconds + minutesSec * 60 + hoursSec * 60 * 60; int cycleOfTrafficLight = 60; int secForLight = timeInSeconds % cycleOfTrafficLight; @@ -46,7 +44,7 @@ private static void trafficLight() { System.out.println(ANSI_RED + "RED" + ANSI_RESET); } } else { - System.out.println("Wrong format. Please type your current time as HH:MM:SS"); + System.out.println("You typed negative numbers or time not according to the format HH:MM:SS"); } } catch (NumberFormatException e) { throw new RuntimeException(e); From a41ea113ffa75dd271ae717015a5d71888b2dcaf Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 18 Jul 2021 02:44:57 +0300 Subject: [PATCH 13/50] Fix for RandomCharsTable task --- src/main/java/homework_2/RandomCharsTable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java index 739fc6c6..2872f221 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -59,8 +59,8 @@ private static void randomCharsTable() { stringBuffer.deleteCharAt(stringBuffer.length() - 1); System.out.print(stringBuffer); - } catch (InputMismatchException e) { - System.out.println("Please follow to the correct format: 2 numbers + even/odd word"); + } catch (InputMismatchException | NegativeArraySizeException e) { + System.out.println("Please follow to the correct format: 2 positive numbers + even/odd word"); } } } From f94a73a150783d83232916058da0ac20cd2b3d90 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 19 Jul 2021 12:15:38 +0300 Subject: [PATCH 14/50] the 2nd Fix for RandomCharsTable task --- src/main/java/homework_2/RandomCharsTable.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/RandomCharsTable.java index 2872f221..0a2c026f 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/RandomCharsTable.java @@ -17,6 +17,11 @@ private static void randomCharsTable() { int widthOfTable = scanner.nextInt(); String strategy = scanner.next(); + if (!"even".equalsIgnoreCase(strategy) && !"odd".equalsIgnoreCase(strategy)) { + System.out.println("Please type a correct strategy: even or odd"); + return; + } + char[][] randomCharsTable = new char[lengthOfTable][widthOfTable]; int minRand = 'A'; From efc7f9b15a7354905e8369c3505be2c82163c44b Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 01:01:47 +0300 Subject: [PATCH 15/50] Add link to Coding bat for README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 52794a70..bf0916ae 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,5 @@ | HW2_3 | [Random chars table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2) | The app that reads 2 numbers as size of a table and a strategy: even or odd, print this table consisting of random symbols from A to Z and then print all symbols in one line which are odd or even according to the strategy (their ASCII codes) | | +[Link to Coding Bat](https://codingbat.com/done?user=lerarodina24@gmail.com&tag=9318549243) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From 071afe254c9ce6ace996d36540c94dfdab934281 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 02:31:58 +0300 Subject: [PATCH 16/50] Add empty ImmutableClass Change a structure of packages with HWs (add packages with tests for each HW, add Main classes fro all three tasks) Add new run method for PyramidPrinter task --- src/main/java/homework_2/PyramidPrinter.java | 31 ------------ .../java/homework_2/pyramid_printer/Main.java | 7 +++ .../pyramid_printer/PyramidPrinter.java | 48 +++++++++++++++++++ .../homework_2/random_chars_table/Main.java | 7 +++ .../RandomCharsTable.java | 8 ++-- .../java/homework_2/traffic_light/Main.java | 7 +++ .../{ => traffic_light}/TrafficLight.java | 9 ++-- src/main/java/homework_3/ImmutableClass.java | 4 ++ .../pyramid_printer/PyramidPrinterTest.java | 4 ++ .../RandomCharsTableTest.java | 4 ++ .../traffic_light/TrafficLight.java | 4 ++ 11 files changed, 93 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/homework_2/PyramidPrinter.java create mode 100644 src/main/java/homework_2/pyramid_printer/Main.java create mode 100644 src/main/java/homework_2/pyramid_printer/PyramidPrinter.java create mode 100644 src/main/java/homework_2/random_chars_table/Main.java rename src/main/java/homework_2/{ => random_chars_table}/RandomCharsTable.java (96%) create mode 100644 src/main/java/homework_2/traffic_light/Main.java rename src/main/java/homework_2/{ => traffic_light}/TrafficLight.java (95%) create mode 100644 src/main/java/homework_3/ImmutableClass.java create mode 100644 src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java create mode 100644 src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java create mode 100644 src/test/java/homework_2/traffic_light/TrafficLight.java diff --git a/src/main/java/homework_2/PyramidPrinter.java b/src/main/java/homework_2/PyramidPrinter.java deleted file mode 100644 index 55672f84..00000000 --- a/src/main/java/homework_2/PyramidPrinter.java +++ /dev/null @@ -1,31 +0,0 @@ -package homework_2; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -public class PyramidPrinter { - public static void main(String[] args) { - printPyramid(); - } - - private static void printPyramid() { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { - System.out.println("Please type a positive integer number:"); - try { - int levelsOfPyramid = Integer.parseInt(reader.readLine()); - for (int i = 1; i <= levelsOfPyramid; i++) { - for (int j = 1; j <= i; j++) { - System.out.print("x"); - } - System.out.println(); - } - } catch (NumberFormatException e) { - System.out.println("You typed not a number, please add a positive number"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - -} diff --git a/src/main/java/homework_2/pyramid_printer/Main.java b/src/main/java/homework_2/pyramid_printer/Main.java new file mode 100644 index 00000000..e50e37eb --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/Main.java @@ -0,0 +1,7 @@ +package homework_2.pyramid_printer; + +public class Main { + public static void main(String[] args) { + new PyramidPrinter().run(); + } +} diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java new file mode 100644 index 00000000..9c4c675b --- /dev/null +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -0,0 +1,48 @@ +package homework_2.pyramid_printer; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +public class PyramidPrinter { + + private static void printPyramid(int levelsOfPyramid) { + for (int i = 1; i <= levelsOfPyramid; i++) { + for (int j = 1; j <= i; j++) { + System.out.print("x"); + } + System.out.println(); + } + } + + public void run() { + System.out.println("Please type a positive integer number:"); + String inputData = readData(); + int getResult = executeProgram(inputData); + printPyramid(getResult); + } + + private int executeProgram(String dataFromInput) { + int levelsOfPyramid = 0; + try { + levelsOfPyramid = Integer.parseInt(dataFromInput); + if (levelsOfPyramid < 0) { + throw new NumberFormatException(); + } + } catch (NumberFormatException e) { + System.out.println("You typed not a number or a negative number, please add a positive number"); + } + return levelsOfPyramid; + } + + private String readData() { + String inputData = null; + try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { + inputData = reader.readLine(); + } catch (IOException e) { + System.out.println("Error:("); + } + return inputData; + } +} + diff --git a/src/main/java/homework_2/random_chars_table/Main.java b/src/main/java/homework_2/random_chars_table/Main.java new file mode 100644 index 00000000..682fe366 --- /dev/null +++ b/src/main/java/homework_2/random_chars_table/Main.java @@ -0,0 +1,7 @@ +package homework_2.random_chars_table; + +public class Main { + public static void main(String[] args) { + new RandomCharsTable().run(); + } +} diff --git a/src/main/java/homework_2/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java similarity index 96% rename from src/main/java/homework_2/RandomCharsTable.java rename to src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 0a2c026f..84ad533e 100644 --- a/src/main/java/homework_2/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,13 +1,10 @@ -package homework_2; +package homework_2.random_chars_table; import java.io.IOException; import java.util.InputMismatchException; import java.util.Scanner; public class RandomCharsTable { - public static void main(String[] args) { - randomCharsTable(); - } private static void randomCharsTable() { try (Scanner scanner = new Scanner(System.in)) { @@ -68,4 +65,7 @@ private static void randomCharsTable() { System.out.println("Please follow to the correct format: 2 positive numbers + even/odd word"); } } + + public void run() { + } } diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java new file mode 100644 index 00000000..fa033081 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -0,0 +1,7 @@ +package homework_2.traffic_light; + +public class Main { + public static void main(String[] args) { + new TrafficLight().run(); + } +} diff --git a/src/main/java/homework_2/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java similarity index 95% rename from src/main/java/homework_2/TrafficLight.java rename to src/main/java/homework_2/traffic_light/TrafficLight.java index 9d3289aa..e7dd78c3 100644 --- a/src/main/java/homework_2/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -1,4 +1,4 @@ -package homework_2; +package homework_2.traffic_light; import java.util.Scanner; @@ -9,10 +9,6 @@ public class TrafficLight { public static final String ANSI_GREEN = "\u001B[32m"; public static final String ANSI_YELLOW = "\u001B[33m"; - public static void main(String[] args) { - trafficLight(); - } - private static void trafficLight() { try (Scanner scanner = new Scanner(System.in)) { System.out.println("Please type your current time (in hh:mm:ss format):"); @@ -50,4 +46,7 @@ private static void trafficLight() { throw new RuntimeException(e); } } + + public void run() { + } } diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java new file mode 100644 index 00000000..2ed7ac09 --- /dev/null +++ b/src/main/java/homework_3/ImmutableClass.java @@ -0,0 +1,4 @@ +package homework_3; + +public class ImmutableClass { +} diff --git a/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java new file mode 100644 index 00000000..671ae607 --- /dev/null +++ b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -0,0 +1,4 @@ +package homework_2.pyramid_printer; + +public class PyramidPrinterTest { +} diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java new file mode 100644 index 00000000..bd0a46e3 --- /dev/null +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -0,0 +1,4 @@ +package homework_2.random_chars_table; + +public class RandomCharsTableTest { +} diff --git a/src/test/java/homework_2/traffic_light/TrafficLight.java b/src/test/java/homework_2/traffic_light/TrafficLight.java new file mode 100644 index 00000000..0e451051 --- /dev/null +++ b/src/test/java/homework_2/traffic_light/TrafficLight.java @@ -0,0 +1,4 @@ +package homework_2.traffic_light; + +public class TrafficLight { +} From d598b6f18e3e4b183a14ebae888dea6033a6a9e7 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 03:38:03 +0300 Subject: [PATCH 17/50] Add requirements for ImmutableClass --- src/main/java/homework_3/ImmutableClass.java | 21 +++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index 2ed7ac09..8f074f6e 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -1,4 +1,23 @@ package homework_3; -public class ImmutableClass { +/* +A Strategy for Defining Immutable Objects (from the official Oracle documentation) + +Don't provide "setter" methods — methods that modify fields or objects referred to by fields. + +Make all fields final and private. + +Don't allow subclasses to override methods. The simplest way to do this is to declare the class as final. +A more sophisticated approach is to make the constructor private and construct instances in factory methods. + +If the instance fields include references to mutable objects, don't allow those objects to be changed: + - Don't provide methods that modify the mutable objects. + - Don't share references to the mutable objects. + Never store references to external, mutable objects passed to the constructor; + if necessary, create copies, and store references to the copies. + Similarly, create copies of your internal mutable objects when necessary to avoid returning the originals in your methods. + */ + +final public class ImmutableClass { + } From 9c0605304e749c8354c9b1d192e949e4f2bab839 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 04:12:33 +0300 Subject: [PATCH 18/50] Add ImmutableClass - RGB (which defines objects that represent colors) --- src/main/java/homework_3/ImmutableClass.java | 58 ++++++++++++++++++-- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index 8f074f6e..f65993ab 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -3,14 +3,14 @@ /* A Strategy for Defining Immutable Objects (from the official Oracle documentation) -Don't provide "setter" methods — methods that modify fields or objects referred to by fields. +1. Don't provide "setter" methods — methods that modify fields or objects referred to by fields. -Make all fields final and private. +2. Make all fields final and private. -Don't allow subclasses to override methods. The simplest way to do this is to declare the class as final. +3. Don't allow subclasses to override methods. The simplest way to do this is to declare the class as final. A more sophisticated approach is to make the constructor private and construct instances in factory methods. -If the instance fields include references to mutable objects, don't allow those objects to be changed: +4. If the instance fields include references to mutable objects, don't allow those objects to be changed: - Don't provide methods that modify the mutable objects. - Don't share references to the mutable objects. Never store references to external, mutable objects passed to the constructor; @@ -20,4 +20,54 @@ A Strategy for Defining Immutable Objects (from the official Oracle documentatio final public class ImmutableClass { + // Values must be between 0 and 255. + final private int red; + final private int green; + final private int blue; + final private String name; + + private void check(int red, + int green, + int blue) { + if (red < 0 || red > 255 + || green < 0 || green > 255 + || blue < 0 || blue > 255) { + throw new IllegalArgumentException(); + } + } + + public ImmutableClass(int red, + int green, + int blue, + String name) { + check(red, green, blue); + this.red = red; + this.green = green; + this.blue = blue; + this.name = name; + } + + public ImmutableClass(int red, int green, int blue) { + this.red = red; + this.green = green; + this.blue = blue; + this.name = "black"; + } + + + public int getRGB() { + return ((red << 16) | (green << 8) | blue); + } + + public String getName() { + return name; + } + + public ImmutableClass invert() { + return new ImmutableClass( + 255 - red, + 255 - green, + 255 - blue, + "Inverse of " + name); + } } From 859c9fbd044bfcc0d925b55b136133616ebd13dc Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 14:23:37 +0300 Subject: [PATCH 19/50] Update Immutable class --- src/main/java/homework_3/ImmutableClass.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index f65993ab..ee937aec 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -20,7 +20,7 @@ A Strategy for Defining Immutable Objects (from the official Oracle documentatio final public class ImmutableClass { - // Values must be between 0 and 255. + // Values must be between 0 and 255 (RGB) final private int red; final private int green; final private int blue; @@ -47,10 +47,10 @@ public ImmutableClass(int red, this.name = name; } - public ImmutableClass(int red, int green, int blue) { - this.red = red; - this.green = green; - this.blue = blue; + public ImmutableClass() { + this.red = 0; + this.green = 0; + this.blue = 0; this.name = "black"; } From b0003c31563cbb60740114574936a57b3beba97d Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 15:08:29 +0300 Subject: [PATCH 20/50] Add new run method for RandomCharsTable task Update structure for RandomCharsTable --- .../random_chars_table/RandomCharsTable.java | 101 ++++++++++-------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 84ad533e..162f3d3a 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -1,71 +1,84 @@ package homework_2.random_chars_table; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.util.InputMismatchException; +import java.util.NoSuchElementException; import java.util.Scanner; public class RandomCharsTable { - private static void randomCharsTable() { - try (Scanner scanner = new Scanner(System.in)) { - System.out.println("Please type size of a table: 2 numbers and strategy - even or odd:"); + private static void randomCharsTable(int lengthOfTable, int widthOfTable, String strategy) { - int lengthOfTable = scanner.nextInt(); - int widthOfTable = scanner.nextInt(); - String strategy = scanner.next(); + char[][] randomCharsTable = new char[lengthOfTable][widthOfTable]; - if (!"even".equalsIgnoreCase(strategy) && !"odd".equalsIgnoreCase(strategy)) { - System.out.println("Please type a correct strategy: even or odd"); - return; - } - - char[][] randomCharsTable = new char[lengthOfTable][widthOfTable]; - - int minRand = 'A'; - int maxRand = 'Z'; - for (int i = 0; i < lengthOfTable; i++) { - for (int j = 0; j < widthOfTable; j++) { - randomCharsTable[i][j] = (char) ((int) (Math.random() * (maxRand - minRand + 1) + minRand)); - System.out.print(" | " + randomCharsTable[i][j] + " |"); - } - System.out.println(); + int minRand = 'A'; + int maxRand = 'Z'; + for (int i = 0; i < lengthOfTable; i++) { + for (int j = 0; j < widthOfTable; j++) { + randomCharsTable[i][j] = (char) ((int) (Math.random() * (maxRand - minRand + 1) + minRand)); + System.out.print(" | " + randomCharsTable[i][j] + " |"); } + System.out.println(); + } - if ("even".equals(strategy.toLowerCase())) { - System.out.print("Even letters: "); - } + if ("even".equals(strategy.toLowerCase())) { + System.out.print("Even letters: "); + } - if ("odd".equals(strategy.toLowerCase())) { - System.out.print("Odd letters: "); - } + if ("odd".equals(strategy.toLowerCase())) { + System.out.print("Odd letters: "); + } - StringBuffer stringBuffer = new StringBuffer(); + StringBuffer stringBuffer = new StringBuffer(); - for (int i = 0; i < lengthOfTable; i++) { - for (int j = 0; j < widthOfTable; j++) { - int codeOfChar = randomCharsTable[i][j]; - if ("even".equals(strategy.toLowerCase())) { - if (codeOfChar % 2 == 0) { - stringBuffer.append(" ").append((char) codeOfChar).append(" ,"); - } + for (int i = 0; i < lengthOfTable; i++) { + for (int j = 0; j < widthOfTable; j++) { + int codeOfChar = randomCharsTable[i][j]; + if ("even".equals(strategy.toLowerCase())) { + if (codeOfChar % 2 == 0) { + stringBuffer.append(" ").append((char) codeOfChar).append(" ,"); } + } - if ("odd".equals(strategy.toLowerCase())) { - if (codeOfChar % 2 != 0) { - stringBuffer.append(" ").append((char) codeOfChar).append(" ,"); - } + if ("odd".equals(strategy.toLowerCase())) { + if (codeOfChar % 2 != 0) { + stringBuffer.append(" ").append((char) codeOfChar).append(" ,"); } } } + } - stringBuffer.deleteCharAt(stringBuffer.length() - 1); + stringBuffer.deleteCharAt(stringBuffer.length() - 1); - System.out.print(stringBuffer); - } catch (InputMismatchException | NegativeArraySizeException e) { - System.out.println("Please follow to the correct format: 2 positive numbers + even/odd word"); - } + System.out.print(stringBuffer); } public void run() { + System.out.println("Please type size of a table: 2 numbers and strategy - even or odd:"); + String inputData = readData(); + try (Scanner inputDataSeparate = new Scanner(inputData)) { + int lengthOfTable = inputDataSeparate.nextInt(); + int widthOfTable = inputDataSeparate.nextInt(); + String strategy = inputDataSeparate.next(); + if (!"even".equalsIgnoreCase(strategy) && !"odd".equalsIgnoreCase(strategy)) { + System.out.println("Please type a correct strategy: even or odd"); + return; + } + randomCharsTable(lengthOfTable, widthOfTable, strategy); + } catch (NegativeArraySizeException | NoSuchElementException e) { + System.out.println("You typed negative numbers or strategy/numbers are not added"); + } + } + + private String readData() { + String inputData; + try (Scanner scanner = new Scanner(System.in)) { + inputData = scanner.nextLine(); + } catch (InputMismatchException e) { + return "Please follow to the correct format: 2 positive numbers + even/odd word"; + } + return inputData; } } From 0d2dadf52ad0ebf15a769ef5e1a7038fb038e6a5 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 15:50:08 +0300 Subject: [PATCH 21/50] Add new run method for TrafficLight task Update structure for TrafficLight --- .../traffic_light/TrafficLight.java | 74 ++++++++++--------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index e7dd78c3..5ff6f95f 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -9,44 +9,50 @@ public class TrafficLight { public static final String ANSI_GREEN = "\u001B[32m"; public static final String ANSI_YELLOW = "\u001B[33m"; - private static void trafficLight() { - try (Scanner scanner = new Scanner(System.in)) { - System.out.println("Please type your current time (in hh:mm:ss format):"); - String str = scanner.nextLine(); - String[] arr; - - if (str.matches("\\d\\d:\\d\\d:\\d\\d")) { - arr = str.split(":"); - int hoursSec = Integer.parseInt(arr[0]) * 60 * 60; - int minutesSec = Integer.parseInt(arr[1]) * 60; - int seconds = Integer.parseInt(arr[2]); - - if (hoursSec > 24 * 60 * 60 || minutesSec > 60 * 60 || seconds >= 60) { - System.out.println("Unfortunately this day has already finished, please check"); - return; - } - - int timeInSeconds = seconds + minutesSec * 60 + hoursSec * 60 * 60; - int cycleOfTrafficLight = 60; - int secForLight = timeInSeconds % cycleOfTrafficLight; - - if (secForLight >= 0 && secForLight < 35) { - System.out.println(ANSI_GREEN + "GREEN" + ANSI_RESET); - } - if (secForLight >= 35 && secForLight < 40 || secForLight >= 55) { - System.out.println(ANSI_YELLOW + "YELLOW" + ANSI_RESET); - } - if (secForLight >= 40 && secForLight < 55) { - System.out.println(ANSI_RED + "RED" + ANSI_RESET); - } - } else { - System.out.println("You typed negative numbers or time not according to the format HH:MM:SS"); + private static void trafficLight(String inputStr) { + String[] arr; + + if (!inputStr.matches("\\d\\d:\\d\\d:\\d\\d")) { + System.out.println("You typed negative numbers/not allowed symbols or time not according to the format HH:MM:SS"); + } else { + arr = inputStr.split(":"); + int hoursSec = Integer.parseInt(arr[0]) * 60 * 60; + int minutesSec = Integer.parseInt(arr[1]) * 60; + int seconds = Integer.parseInt(arr[2]); + + if (hoursSec > 24 * 60 * 60 || minutesSec > 60 * 60 || seconds >= 60) { + System.out.println("The day is over"); + return; + } + + int timeInSeconds = seconds + minutesSec * 60 + hoursSec * 60 * 60; + int cycleOfTrafficLight = 60; + int secForLight = timeInSeconds % cycleOfTrafficLight; + + if (secForLight >= 0 && secForLight < 35) { + System.out.println(ANSI_GREEN + "GREEN" + ANSI_RESET); + } + if (secForLight >= 35 && secForLight < 40 || secForLight >= 55) { + System.out.println(ANSI_YELLOW + "YELLOW" + ANSI_RESET); + } + if (secForLight >= 40 && secForLight < 55) { + System.out.println(ANSI_RED + "RED" + ANSI_RESET); } - } catch (NumberFormatException e) { - throw new RuntimeException(e); } } public void run() { + System.out.println("Please type your current time in HH:MM:SS format:"); + String inputData = readData(); + trafficLight(inputData); + } + + private String readData() { + try (Scanner scanner = new Scanner(System.in)) { + String str = scanner.nextLine(); + return str; + } catch (NumberFormatException e) { + return "Error:("; + } } } From 8d1cf7734e1ca63f66ddface1cf55402a3d31183 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 17:24:04 +0300 Subject: [PATCH 22/50] Fix text for errors for all 3 tasks Add tests for PyramidPrinter --- .../pyramid_printer/PyramidPrinter.java | 4 +- .../random_chars_table/RandomCharsTable.java | 12 +-- .../traffic_light/TrafficLight.java | 4 +- .../pyramid_printer/PyramidPrinterTest.java | 80 ++++++++++++++++++- 4 files changed, 89 insertions(+), 11 deletions(-) diff --git a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java index 9c4c675b..70347987 100644 --- a/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java +++ b/src/main/java/homework_2/pyramid_printer/PyramidPrinter.java @@ -30,7 +30,7 @@ private int executeProgram(String dataFromInput) { throw new NumberFormatException(); } } catch (NumberFormatException e) { - System.out.println("You typed not a number or a negative number, please add a positive number"); + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); } return levelsOfPyramid; } @@ -40,7 +40,7 @@ private String readData() { try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { inputData = reader.readLine(); } catch (IOException e) { - System.out.println("Error:("); + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); } return inputData; } diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 162f3d3a..31825f81 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -18,17 +18,17 @@ private static void randomCharsTable(int lengthOfTable, int widthOfTable, String for (int i = 0; i < lengthOfTable; i++) { for (int j = 0; j < widthOfTable; j++) { randomCharsTable[i][j] = (char) ((int) (Math.random() * (maxRand - minRand + 1) + minRand)); - System.out.print(" | " + randomCharsTable[i][j] + " |"); + System.out.print("| " + randomCharsTable[i][j] + " | "); } System.out.println(); } if ("even".equals(strategy.toLowerCase())) { - System.out.print("Even letters: "); + System.out.print("Even letters - "); } if ("odd".equals(strategy.toLowerCase())) { - System.out.print("Odd letters: "); + System.out.print("Odd letters - "); } StringBuffer stringBuffer = new StringBuffer(); @@ -63,12 +63,12 @@ public void run() { int widthOfTable = inputDataSeparate.nextInt(); String strategy = inputDataSeparate.next(); if (!"even".equalsIgnoreCase(strategy) && !"odd".equalsIgnoreCase(strategy)) { - System.out.println("Please type a correct strategy: even or odd"); + System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); return; } randomCharsTable(lengthOfTable, widthOfTable, strategy); } catch (NegativeArraySizeException | NoSuchElementException e) { - System.out.println("You typed negative numbers or strategy/numbers are not added"); + System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); } } @@ -77,7 +77,7 @@ private String readData() { try (Scanner scanner = new Scanner(System.in)) { inputData = scanner.nextLine(); } catch (InputMismatchException e) { - return "Please follow to the correct format: 2 positive numbers + even/odd word"; + return "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; } return inputData; } diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index 5ff6f95f..b91cb5a3 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -13,7 +13,7 @@ private static void trafficLight(String inputStr) { String[] arr; if (!inputStr.matches("\\d\\d:\\d\\d:\\d\\d")) { - System.out.println("You typed negative numbers/not allowed symbols or time not according to the format HH:MM:SS"); + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); } else { arr = inputStr.split(":"); int hoursSec = Integer.parseInt(arr[0]) * 60 * 60; @@ -52,7 +52,7 @@ private String readData() { String str = scanner.nextLine(); return str; } catch (NumberFormatException e) { - return "Error:("; + return "Only 1 non-negative integer is allowed as passed parameter"; } } } diff --git a/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java index 671ae607..1212a5bf 100644 --- a/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java +++ b/src/test/java/homework_2/pyramid_printer/PyramidPrinterTest.java @@ -1,4 +1,82 @@ package homework_2.pyramid_printer; -public class PyramidPrinterTest { +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PyramidPrinterTest extends UnitBase { + + @Test + void EmptyInputTest() { + setInput(""); + + new PyramidPrinter().run(); + removeFromOutput("Please type a positive integer number:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void NullInputTest() { + setInput("0"); + + new PyramidPrinter().run(); + removeFromOutput("Please type a positive integer number:"); + assertEquals("", + getOutputLines()[0]); + } + + @Test + void CorrectInputTest() { + setInput("5"); + + new PyramidPrinter().run(); + removeFromOutput("Please type a positive integer number:"); + assertEquals("x", getOutputLines()[0]); + assertEquals("xx", getOutputLines()[1]); + assertEquals("xxx", getOutputLines()[2]); + assertEquals("xxxx", getOutputLines()[3]); + assertEquals("xxxxx", getOutputLines()[4]); + } + + @Test + void NegativeInputTest() { + setInput("-5"); + + new PyramidPrinter().run(); + removeFromOutput("Please type a positive integer number:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void LongNotIntInputTest() { + setInput("99999999999999999"); + + new PyramidPrinter().run(); + removeFromOutput("Please type a positive integer number:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void StringInputTest() { + setInput("hello"); + + new PyramidPrinter().run(); + removeFromOutput("Please type a positive integer number:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void DoubleInputTest() { + setInput("0.5"); + + new PyramidPrinter().run(); + removeFromOutput("Please type a positive integer number:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } } From 5d96e600cb613f681faadd25c75ba7908e0db689 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 18:18:02 +0300 Subject: [PATCH 23/50] Move task to new ExtraTrafficLight class Add TrafficLight task Fix Main class with choosing mode --- .../traffic_light/ExtraTrafficLight.java | 58 +++++++++++++++++++ .../java/homework_2/traffic_light/Main.java | 6 +- .../traffic_light/TrafficLight.java | 52 +++++++---------- 3 files changed, 85 insertions(+), 31 deletions(-) create mode 100644 src/main/java/homework_2/traffic_light/ExtraTrafficLight.java diff --git a/src/main/java/homework_2/traffic_light/ExtraTrafficLight.java b/src/main/java/homework_2/traffic_light/ExtraTrafficLight.java new file mode 100644 index 00000000..f18bcad5 --- /dev/null +++ b/src/main/java/homework_2/traffic_light/ExtraTrafficLight.java @@ -0,0 +1,58 @@ +package homework_2.traffic_light; + +import java.util.Scanner; + +public class ExtraTrafficLight { + + public static final String ANSI_RESET = "\u001B[0m"; + public static final String ANSI_RED = "\u001B[31m"; + public static final String ANSI_GREEN = "\u001B[32m"; + public static final String ANSI_YELLOW = "\u001B[33m"; + + private static void trafficLight(String inputStr) { + String[] arr; + + if (!inputStr.matches("\\d\\d:\\d\\d:\\d\\d")) { + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + } else { + arr = inputStr.split(":"); + int hoursSec = Integer.parseInt(arr[0]) * 60 * 60; + int minutesSec = Integer.parseInt(arr[1]) * 60; + int seconds = Integer.parseInt(arr[2]); + + if (hoursSec > 24 * 60 * 60 || minutesSec > 60 * 60 || seconds >= 60) { + System.out.println("The day is over"); + return; + } + + int timeInSeconds = seconds + minutesSec * 60 + hoursSec * 60 * 60; + int cycleOfTrafficLight = 60; + int secForLight = timeInSeconds % cycleOfTrafficLight; + + if (secForLight >= 0 && secForLight < 35) { + System.out.println(ANSI_GREEN + "GREEN" + ANSI_RESET); + } + if (secForLight >= 35 && secForLight < 40 || secForLight >= 55) { + System.out.println(ANSI_YELLOW + "YELLOW" + ANSI_RESET); + } + if (secForLight >= 40 && secForLight < 55) { + System.out.println(ANSI_RED + "RED" + ANSI_RESET); + } + } + } + + public void run() { + System.out.println("Please type your current time in HH:MM:SS format:"); + String inputData = readData(); + trafficLight(inputData); + } + + private String readData() { + try (Scanner scanner = new Scanner(System.in)) { + String str = scanner.nextLine(); + return str; + } catch (NumberFormatException e) { + return "Only 1 non-negative integer is allowed as passed parameter"; + } + } +} diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java index fa033081..d7c44003 100644 --- a/src/main/java/homework_2/traffic_light/Main.java +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -2,6 +2,10 @@ public class Main { public static void main(String[] args) { - new TrafficLight().run(); + if (args[0].equals("ExtraMode")) { + new ExtraTrafficLight().run(); + } else { + new TrafficLight().run(); + } } } diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index b91cb5a3..ad8d550d 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -3,53 +3,45 @@ import java.util.Scanner; public class TrafficLight { - public static final String ANSI_RESET = "\u001B[0m"; public static final String ANSI_RED = "\u001B[31m"; public static final String ANSI_GREEN = "\u001B[32m"; public static final String ANSI_YELLOW = "\u001B[33m"; - private static void trafficLight(String inputStr) { - String[] arr; + private static void trafficLight(String secondsStr) { - if (!inputStr.matches("\\d\\d:\\d\\d:\\d\\d")) { + int seconds = Integer.parseInt(secondsStr); + if (seconds < 0) { System.out.println("Only 1 non-negative integer is allowed as passed parameter"); - } else { - arr = inputStr.split(":"); - int hoursSec = Integer.parseInt(arr[0]) * 60 * 60; - int minutesSec = Integer.parseInt(arr[1]) * 60; - int seconds = Integer.parseInt(arr[2]); - - if (hoursSec > 24 * 60 * 60 || minutesSec > 60 * 60 || seconds >= 60) { - System.out.println("The day is over"); - return; - } - - int timeInSeconds = seconds + minutesSec * 60 + hoursSec * 60 * 60; - int cycleOfTrafficLight = 60; - int secForLight = timeInSeconds % cycleOfTrafficLight; - - if (secForLight >= 0 && secForLight < 35) { - System.out.println(ANSI_GREEN + "GREEN" + ANSI_RESET); - } - if (secForLight >= 35 && secForLight < 40 || secForLight >= 55) { - System.out.println(ANSI_YELLOW + "YELLOW" + ANSI_RESET); - } - if (secForLight >= 40 && secForLight < 55) { - System.out.println(ANSI_RED + "RED" + ANSI_RESET); - } + return; + } else if (seconds > 86399) { + System.out.println("The day is over"); + return; + } + + int cycleOfTrafficLight = 60; + int secForLight = seconds % cycleOfTrafficLight; + + if (secForLight < 35) { + System.out.println(ANSI_GREEN + "GREEN" + ANSI_RESET); + } + if (secForLight >= 35 && secForLight < 40 || secForLight >= 55) { + System.out.println(ANSI_YELLOW + "YELLOW" + ANSI_RESET); + } + if (secForLight >= 40 && secForLight < 55) { + System.out.println(ANSI_RED + "RED" + ANSI_RESET); } } public void run() { - System.out.println("Please type your current time in HH:MM:SS format:"); + System.out.println("Please type your current time in seconds:"); String inputData = readData(); trafficLight(inputData); } private String readData() { try (Scanner scanner = new Scanner(System.in)) { - String str = scanner.nextLine(); + String str = scanner.next(); return str; } catch (NumberFormatException e) { return "Only 1 non-negative integer is allowed as passed parameter"; From e8d13e314a20ea682d99bfe5956d0a321a1be91e Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 18:49:14 +0300 Subject: [PATCH 24/50] Add tests for TrafficLight task Fix bug which tests were found --- .../traffic_light/TrafficLight.java | 26 +++-- .../RandomCharsTableTest.java | 8 +- .../traffic_light/TrafficLight.java | 4 - .../traffic_light/TrafficLightTest.java | 109 ++++++++++++++++++ 4 files changed, 132 insertions(+), 15 deletions(-) delete mode 100644 src/test/java/homework_2/traffic_light/TrafficLight.java create mode 100644 src/test/java/homework_2/traffic_light/TrafficLightTest.java diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index ad8d550d..8ac953fe 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -1,5 +1,6 @@ package homework_2.traffic_light; +import java.util.NoSuchElementException; import java.util.Scanner; public class TrafficLight { @@ -9,14 +10,18 @@ public class TrafficLight { public static final String ANSI_YELLOW = "\u001B[33m"; private static void trafficLight(String secondsStr) { - - int seconds = Integer.parseInt(secondsStr); - if (seconds < 0) { + int seconds = 0; + try { + seconds = Integer.parseInt(secondsStr); + if (seconds < 0) { + System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + return; + } else if (seconds > 86399) { + System.out.println("The day is over"); + return; + } + } catch (NumberFormatException e) { System.out.println("Only 1 non-negative integer is allowed as passed parameter"); - return; - } else if (seconds > 86399) { - System.out.println("The day is over"); - return; } int cycleOfTrafficLight = 60; @@ -40,11 +45,12 @@ public void run() { } private String readData() { + String str; try (Scanner scanner = new Scanner(System.in)) { - String str = scanner.next(); - return str; - } catch (NumberFormatException e) { + str = scanner.next(); + } catch (NoSuchElementException e) { return "Only 1 non-negative integer is allowed as passed parameter"; } + return str; } } diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index bd0a46e3..8148cf21 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -1,4 +1,10 @@ package homework_2.random_chars_table; -public class RandomCharsTableTest { +import base.UnitBase; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class RandomCharsTableTest extends UnitBase { + } diff --git a/src/test/java/homework_2/traffic_light/TrafficLight.java b/src/test/java/homework_2/traffic_light/TrafficLight.java deleted file mode 100644 index 0e451051..00000000 --- a/src/test/java/homework_2/traffic_light/TrafficLight.java +++ /dev/null @@ -1,4 +0,0 @@ -package homework_2.traffic_light; - -public class TrafficLight { -} diff --git a/src/test/java/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/TrafficLightTest.java new file mode 100644 index 00000000..538e932f --- /dev/null +++ b/src/test/java/homework_2/traffic_light/TrafficLightTest.java @@ -0,0 +1,109 @@ +package homework_2.traffic_light; + +import base.UnitBase; +import homework_2.pyramid_printer.PyramidPrinter; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class TrafficLightTest extends UnitBase { + @Test + void EmptyInputTest() { + setInput(""); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void NullGreenColorInputTest() { + setInput("0"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("[32mGREEN\u001B[0m", + getOutputLines()[0]); + } + + @Test + void GreenColorInputTest() { + setInput("5"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("[32mGREEN\u001B[0m", + getOutputLines()[0]); + } + + @Test + void YellowColorInputTest() { + setInput("35"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("[33mYELLOW\u001B[0m", + getOutputLines()[0]); + } + + @Test + void RedColorInputTest() { + setInput("54"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("[31mRED\u001B[0m", + getOutputLines()[0]); + } + + @Test + void DayIsOverInputTest() { + setInput("86400"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("The day is over", + getOutputLines()[0]); + } + + @Test + void NegativeInputTest() { + setInput("-55"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void StringInputTest() { + setInput("hello"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void DoubleInputTest() { + setInput("0.5"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } + + @Test + void LongInputTest() { + setInput("999999999999999"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } +} From 4b8140c7142600cee0f8d5f69d7923a9af9ee7a6 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 19:07:49 +0300 Subject: [PATCH 25/50] Update README with homework 3 - Immutable class --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index bf0916ae..1a1a4587 100644 --- a/README.md +++ b/README.md @@ -5,10 +5,10 @@ | Number | Solution | Short description | --- | --- | --- | | HW1 | [Console printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_1) | The app that reads input arguments and prints them, until "error" argument | -| HW2_1 | [Traffic light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2) | The app that reads the number of seconds from the beginning of the day from the command line displays the color of the traffic light (green, yellow or red) | -| HW2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2) | The app that reads the number from the command line and print a pyramid with levels according to this number, this pyramid consists only of 'x' symbols | -| HW2_3 | [Random chars table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2) | The app that reads 2 numbers as size of a table and a strategy: even or odd, print this table consisting of random symbols from A to Z and then print all symbols in one line which are odd or even according to the strategy (their ASCII codes) | -| +| HW2_1 | [Traffic light](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2/traffic_light) | The app that reads the number of seconds from the beginning of the day from the command line displays the color of the traffic light (green, yellow or red) | +| HW2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2/pyramid_printer) | The app that reads the number from the command line and print a pyramid with levels according to this number, this pyramid consists only of 'x' symbols | +| HW2_3 | [Random chars table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2/random_chars_table) | The app that reads 2 numbers as size of a table and a strategy: even or odd, print this table consisting of random symbols from A to Z and then print all symbols in one line which are odd or even according to the strategy (their ASCII codes) | +| HW_3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_3) | Immutable class with fields (including reference type), several constructors, method which return new object and requirements for Immutable class in comments | [Link to Coding Bat](https://codingbat.com/done?user=lerarodina24@gmail.com&tag=9318549243) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) From 6f6accb3186102d1300249fb7eb45cb12126a041 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 25 Jul 2021 19:36:18 +0300 Subject: [PATCH 26/50] 1st iteration: Add tests for RandomCharsTable --- .../random_chars_table/RandomCharsTable.java | 6 +- .../RandomCharsTableTest.java | 86 +++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 31825f81..62e442d8 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -62,6 +62,10 @@ public void run() { int lengthOfTable = inputDataSeparate.nextInt(); int widthOfTable = inputDataSeparate.nextInt(); String strategy = inputDataSeparate.next(); + if (lengthOfTable <= 0 || widthOfTable <= 0) { + System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); + return; + } if (!"even".equalsIgnoreCase(strategy) && !"odd".equalsIgnoreCase(strategy)) { System.out.println("Passed parameters should match the format [positive integer] [positive integer] [even|odd]"); return; @@ -76,7 +80,7 @@ private String readData() { String inputData; try (Scanner scanner = new Scanner(System.in)) { inputData = scanner.nextLine(); - } catch (InputMismatchException e) { + } catch (NoSuchElementException e) { return "Passed parameters should match the format [positive integer] [positive integer] [even|odd]"; } return inputData; diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index 8148cf21..9a711990 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -7,4 +7,90 @@ public class RandomCharsTableTest extends UnitBase { + @Test + void EmptyInputTest() { + setInput(""); + + new RandomCharsTable().run(); + removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void NullSizeInputTest() { + setInput("0 0 odd"); + + new RandomCharsTable().run(); + removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + +// @Test +// void EvenStrategyInputTest() { +// setInput("3 4 even"); +// +// new RandomCharsTable().run(); +// removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); +// assertEquals(); +// } +// +// @Test +// void OddStrategyInputTest() { +// setInput("5 4 odd"); +// +// new RandomCharsTable().run(); +// removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); +// assertEquals(); +// } +// +// @Test +// void TableWithSizeOneInputTest() { +// setInput("1 1 even"); +// +// new RandomCharsTable().run(); +// removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); +// assertEquals(); +// } + + @Test + void NegativeInputTest() { + setInput("-3 4 even"); + + new RandomCharsTable().run(); + removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void WrongStrategyInputTest() { + setInput("3 4 fghgfhgfh"); + + new RandomCharsTable().run(); + removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void OnlyStringInputTest() { + setInput("hello"); + + new RandomCharsTable().run(); + removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } + + @Test + void WrongNumberOfParamsInputTest() { + setInput("123"); + + new RandomCharsTable().run(); + removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); + assertEquals("Passed parameters should match the format [positive integer] [positive integer] [even|odd]", + getOutputLines()[0]); + } } From a0fcc65cb3e523fb94ce00fdd1f61b169aa09856 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 26 Jul 2021 01:49:33 +0300 Subject: [PATCH 27/50] Fix RandomCharsTable and TrafficLight tasks after review Add new test for TrafficLight --- .../random_chars_table/RandomCharsTable.java | 7 ++++--- .../java/homework_2/traffic_light/TrafficLight.java | 3 ++- .../homework_2/traffic_light/TrafficLightTest.java | 10 ++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java index 62e442d8..f41173f6 100644 --- a/src/main/java/homework_2/random_chars_table/RandomCharsTable.java +++ b/src/main/java/homework_2/random_chars_table/RandomCharsTable.java @@ -50,9 +50,10 @@ private static void randomCharsTable(int lengthOfTable, int widthOfTable, String } } - stringBuffer.deleteCharAt(stringBuffer.length() - 1); - - System.out.print(stringBuffer); + if (stringBuffer.length() != 1 && stringBuffer.length() != 0) { + stringBuffer.deleteCharAt(stringBuffer.length() - 1); + stringBuffer.deleteCharAt(stringBuffer.length() - 1); + } } public void run() { diff --git a/src/main/java/homework_2/traffic_light/TrafficLight.java b/src/main/java/homework_2/traffic_light/TrafficLight.java index 8ac953fe..271add98 100644 --- a/src/main/java/homework_2/traffic_light/TrafficLight.java +++ b/src/main/java/homework_2/traffic_light/TrafficLight.java @@ -22,6 +22,7 @@ private static void trafficLight(String secondsStr) { } } catch (NumberFormatException e) { System.out.println("Only 1 non-negative integer is allowed as passed parameter"); + return; } int cycleOfTrafficLight = 60; @@ -47,7 +48,7 @@ public void run() { private String readData() { String str; try (Scanner scanner = new Scanner(System.in)) { - str = scanner.next(); + str = scanner.nextLine(); } catch (NoSuchElementException e) { return "Only 1 non-negative integer is allowed as passed parameter"; } diff --git a/src/test/java/homework_2/traffic_light/TrafficLightTest.java b/src/test/java/homework_2/traffic_light/TrafficLightTest.java index 538e932f..8630513d 100644 --- a/src/test/java/homework_2/traffic_light/TrafficLightTest.java +++ b/src/test/java/homework_2/traffic_light/TrafficLightTest.java @@ -106,4 +106,14 @@ void LongInputTest() { assertEquals("Only 1 non-negative integer is allowed as passed parameter", getOutputLines()[0]); } + + @Test + void TwoArgumentsInputTest() { + setInput("5 7"); + + new TrafficLight().run(); + removeFromOutput("Please type your current time in seconds:"); + assertEquals("Only 1 non-negative integer is allowed as passed parameter", + getOutputLines()[0]); + } } From e86428cc7ea2f75b1d877a477a4a425ccd2f3ebf Mon Sep 17 00:00:00 2001 From: vrodina Date: Fri, 6 Aug 2021 01:04:05 +0300 Subject: [PATCH 28/50] Fix comment type in ImmutableClass Add Extramode to main --- src/main/java/homework_2/traffic_light/Main.java | 5 ++++- src/main/java/homework_3/ImmutableClass.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/homework_2/traffic_light/Main.java b/src/main/java/homework_2/traffic_light/Main.java index d7c44003..91c7f21b 100644 --- a/src/main/java/homework_2/traffic_light/Main.java +++ b/src/main/java/homework_2/traffic_light/Main.java @@ -2,7 +2,10 @@ public class Main { public static void main(String[] args) { - if (args[0].equals("ExtraMode")) { + /* if you need to launch a program with Extra mode (with another format of current time) - + add "extramode" to your Program arguments + */ + if (args[0].equalsIgnoreCase("extramode")) { new ExtraTrafficLight().run(); } else { new TrafficLight().run(); diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index ee937aec..aff0cbfc 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -1,6 +1,6 @@ package homework_3; -/* +/** A Strategy for Defining Immutable Objects (from the official Oracle documentation) 1. Don't provide "setter" methods — methods that modify fields or objects referred to by fields. From d1fd579934676dc7de84d3d18606bcfdc98b5fb6 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sat, 7 Aug 2021 01:33:37 +0300 Subject: [PATCH 29/50] Add CustomFileReader carcass and new structure for hw4 --- .../custom_file_reader/CustomFileReader.java | 15 +++++++++++++++ .../java/homework_4/custom_file_reader/Main.java | 7 +++++++ 2 files changed, 22 insertions(+) create mode 100644 src/main/java/homework_4/custom_file_reader/CustomFileReader.java create mode 100644 src/main/java/homework_4/custom_file_reader/Main.java diff --git a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java new file mode 100644 index 00000000..a321cf0f --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -0,0 +1,15 @@ +package homework_4.custom_file_reader; + +public class CustomFileReader { + public void run1() { + } + + public void run2() { + } + + public void run3() { + } + + public void run4() { + } +} diff --git a/src/main/java/homework_4/custom_file_reader/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java new file mode 100644 index 00000000..3cd5f930 --- /dev/null +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -0,0 +1,7 @@ +package homework_4.custom_file_reader; + +public class Main { + public static void main(String[] args) { + new CustomFileReader().run1(); + } +} From eac4166e2124d45fff0885eaeee491a8aa012ebd Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 8 Aug 2021 01:48:38 +0300 Subject: [PATCH 30/50] Add CustomFileReader task + the method for unit testing --- .../java/homework_4/CustomFileReader.java | 73 +++++++++++++++++++ src/main/java/homework_4/Main.java | 9 +++ .../custom_file_reader/CustomFileReader.java | 15 ---- .../homework_4/custom_file_reader/Main.java | 7 -- .../resources/custom_file_reader/fileTest.txt | 5 ++ .../CustomFileReaderTest.java | 34 +++++++++ 6 files changed, 121 insertions(+), 22 deletions(-) create mode 100644 src/main/java/homework_4/CustomFileReader.java create mode 100644 src/main/java/homework_4/Main.java delete mode 100644 src/main/java/homework_4/custom_file_reader/CustomFileReader.java delete mode 100644 src/main/java/homework_4/custom_file_reader/Main.java create mode 100644 src/main/resources/custom_file_reader/fileTest.txt create mode 100644 src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java diff --git a/src/main/java/homework_4/CustomFileReader.java b/src/main/java/homework_4/CustomFileReader.java new file mode 100644 index 00000000..a28cb07c --- /dev/null +++ b/src/main/java/homework_4/CustomFileReader.java @@ -0,0 +1,73 @@ +package homework_4; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Scanner; + +public class CustomFileReader { + + public String file = "src/main/resources/custom_file_reader/fileTest.txt"; + Path path = Paths.get(file); + + public void run1() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(file)); + StringBuilder stringBuilder = new StringBuilder(); + String currentLine = reader.readLine(); + while (currentLine != null) { + stringBuilder.append(currentLine).append("\n"); + currentLine = reader.readLine(); + } + System.out.println(stringBuilder.toString().replaceAll("[.,]", "")); + reader.close(); + + } + + public void run2() throws FileNotFoundException { + Scanner scanner = new Scanner(new File(file)); + while (scanner.hasNext()) { + String currentLine = scanner.nextLine(); + String newLine = currentLine.replaceAll("[.,]", ""); + System.out.print(newLine); + } + scanner.close(); + } + + public void run3() throws IOException { + String read = Files.readAllLines(path).get(0); + System.out.println(read.replaceAll("[,.]", "")); + } + + public void run4() throws IOException { + BufferedReader reader = Files.newBufferedReader(path); + StringBuilder stringBuilder = new StringBuilder(); + String currentLine = reader.readLine(); + while (currentLine != null) { + stringBuilder.append(currentLine).append("\n"); + currentLine = reader.readLine(); + } + System.out.println(stringBuilder.toString().replaceAll("[.,]", "")); + reader.close(); + } + + public void run5() throws IOException { + RandomAccessFile reader = new RandomAccessFile(file, "r"); + FileChannel channel = reader.getChannel(); + + int bufferSize = 1024; + if (bufferSize > channel.size()) { + bufferSize = (int) channel.size(); + } + ByteBuffer buff = ByteBuffer.allocate(bufferSize); + channel.read(buff); + buff.flip(); + + System.out.println(new String(buff.array()).replaceAll("[,.]", "")); + + channel.close(); + reader.close(); + } +} diff --git a/src/main/java/homework_4/Main.java b/src/main/java/homework_4/Main.java new file mode 100644 index 00000000..d445d870 --- /dev/null +++ b/src/main/java/homework_4/Main.java @@ -0,0 +1,9 @@ +package homework_4; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + new CustomFileReader().run1(); + } +} diff --git a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java deleted file mode 100644 index a321cf0f..00000000 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ /dev/null @@ -1,15 +0,0 @@ -package homework_4.custom_file_reader; - -public class CustomFileReader { - public void run1() { - } - - public void run2() { - } - - public void run3() { - } - - public void run4() { - } -} diff --git a/src/main/java/homework_4/custom_file_reader/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java deleted file mode 100644 index 3cd5f930..00000000 --- a/src/main/java/homework_4/custom_file_reader/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package homework_4.custom_file_reader; - -public class Main { - public static void main(String[] args) { - new CustomFileReader().run1(); - } -} diff --git a/src/main/resources/custom_file_reader/fileTest.txt b/src/main/resources/custom_file_reader/fileTest.txt new file mode 100644 index 00000000..3abbd376 --- /dev/null +++ b/src/main/resources/custom_file_reader/fileTest.txt @@ -0,0 +1,5 @@ +dfdsg,dfgdfgfd. gdf,gdf,gdf.g,fgs.ds,.,.,dfgdfg +,dfgdf.gdfg,fdg,dfg...gerwerewrew +d. +.,.,..,. +ffff,,,, \ No newline at end of file diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java new file mode 100644 index 00000000..884367be --- /dev/null +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -0,0 +1,34 @@ +package homework_4.custom_file_reader; + +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class CustomFileReaderTest { + +// @Test +// +// @Test +// +// @Test +// +// @Test +// +// @Test + + private String readFromInputStream(InputStream inputStream) + throws IOException { + StringBuilder resultStringBuilder = new StringBuilder(); + try (BufferedReader br + = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + while ((line = br.readLine()) != null) { + resultStringBuilder.append(line).append("\n"); + } + } + return resultStringBuilder.toString(); + } +} From eeedfbb3cc4c6db5ab993cd01d9b7a21c13a5647 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 8 Aug 2021 01:50:10 +0300 Subject: [PATCH 31/50] Add new package --- .../homework_4/{ => custom_file_reader}/CustomFileReader.java | 2 +- src/main/java/homework_4/{ => custom_file_reader}/Main.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/homework_4/{ => custom_file_reader}/CustomFileReader.java (98%) rename src/main/java/homework_4/{ => custom_file_reader}/Main.java (80%) diff --git a/src/main/java/homework_4/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java similarity index 98% rename from src/main/java/homework_4/CustomFileReader.java rename to src/main/java/homework_4/custom_file_reader/CustomFileReader.java index a28cb07c..a19fef3d 100644 --- a/src/main/java/homework_4/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -1,4 +1,4 @@ -package homework_4; +package homework_4.custom_file_reader; import java.io.*; import java.nio.ByteBuffer; diff --git a/src/main/java/homework_4/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java similarity index 80% rename from src/main/java/homework_4/Main.java rename to src/main/java/homework_4/custom_file_reader/Main.java index d445d870..60a03fca 100644 --- a/src/main/java/homework_4/Main.java +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -1,4 +1,4 @@ -package homework_4; +package homework_4.custom_file_reader; import java.io.IOException; From dd81725fc51f19cf30a3f6b7085c6df483cb6c25 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 8 Aug 2021 21:10:49 +0300 Subject: [PATCH 32/50] Fix CustomFileReader task, add tests for CustomFileReader --- .../custom_file_reader/CustomFileReader.java | 23 ++- .../homework_4/custom_file_reader/Main.java | 6 +- .../custom_file_reader/emptyFileForTests.txt | 0 .../custom_file_reader/fileDotsCommasOnly.txt | 1 + .../resources/custom_file_reader/fileTest.txt | 6 +- .../CustomFileReaderTest.java | 181 +++++++++++++++--- 6 files changed, 179 insertions(+), 38 deletions(-) create mode 100644 src/main/resources/custom_file_reader/emptyFileForTests.txt create mode 100644 src/main/resources/custom_file_reader/fileDotsCommasOnly.txt diff --git a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java index a19fef3d..eeeade66 100644 --- a/src/main/java/homework_4/custom_file_reader/CustomFileReader.java +++ b/src/main/java/homework_4/custom_file_reader/CustomFileReader.java @@ -5,13 +5,22 @@ import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class CustomFileReader { - public String file = "src/main/resources/custom_file_reader/fileTest.txt"; - Path path = Paths.get(file); + public String file; + public Path path; + + public CustomFileReader(String file) { + this.file = file; + } + + public CustomFileReader(Path path) { + this.path = path; + } public void run1() throws IOException { BufferedReader reader = new BufferedReader(new FileReader(file)); @@ -37,8 +46,12 @@ public void run2() throws FileNotFoundException { } public void run3() throws IOException { - String read = Files.readAllLines(path).get(0); - System.out.println(read.replaceAll("[,.]", "")); + List read = Files.readAllLines(path); + StringBuilder res = new StringBuilder(); + for (String s : read) { + res.append(s.replaceAll("[,.]", "")); + } + System.out.println(res.toString()); } public void run4() throws IOException { diff --git a/src/main/java/homework_4/custom_file_reader/Main.java b/src/main/java/homework_4/custom_file_reader/Main.java index 60a03fca..642756ba 100644 --- a/src/main/java/homework_4/custom_file_reader/Main.java +++ b/src/main/java/homework_4/custom_file_reader/Main.java @@ -1,9 +1,13 @@ package homework_4.custom_file_reader; import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; public class Main { public static void main(String[] args) throws IOException { - new CustomFileReader().run1(); + String file = "src/main/resources/custom_file_reader/fileTest.txt"; + Path path = Paths.get("src/main/resources/custom_file_reader/fileTest.txt"); + new CustomFileReader(path).run3(); } } diff --git a/src/main/resources/custom_file_reader/emptyFileForTests.txt b/src/main/resources/custom_file_reader/emptyFileForTests.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/custom_file_reader/fileDotsCommasOnly.txt b/src/main/resources/custom_file_reader/fileDotsCommasOnly.txt new file mode 100644 index 00000000..17b12b42 --- /dev/null +++ b/src/main/resources/custom_file_reader/fileDotsCommasOnly.txt @@ -0,0 +1 @@ +,.,.,.,.,.,.,.,.,.,.,.,.,., \ No newline at end of file diff --git a/src/main/resources/custom_file_reader/fileTest.txt b/src/main/resources/custom_file_reader/fileTest.txt index 3abbd376..4a58d843 100644 --- a/src/main/resources/custom_file_reader/fileTest.txt +++ b/src/main/resources/custom_file_reader/fileTest.txt @@ -1,5 +1 @@ -dfdsg,dfgdfgfd. gdf,gdf,gdf.g,fgs.ds,.,.,dfgdfg -,dfgdf.gdfg,fdg,dfg...gerwerewrew -d. -.,.,..,. -ffff,,,, \ No newline at end of file +dfgdfg,dg.d.gdfg,g,dfg.df,g.fdg,df.gf.g,,,,,,fdg.dfg.dfg.df.gdf.,g, \ No newline at end of file diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java index 884367be..b41d1f15 100644 --- a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -1,34 +1,161 @@ package homework_4.custom_file_reader; +import base.UnitBase; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.io.BufferedReader; +import static org.junit.jupiter.api.Assertions.*; + +import java.io.FileNotFoundException; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -public class CustomFileReaderTest { - -// @Test -// -// @Test -// -// @Test -// -// @Test -// -// @Test - - private String readFromInputStream(InputStream inputStream) - throws IOException { - StringBuilder resultStringBuilder = new StringBuilder(); - try (BufferedReader br - = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = br.readLine()) != null) { - resultStringBuilder.append(line).append("\n"); - } - } - return resultStringBuilder.toString(); +import java.nio.file.Path; +import java.nio.file.Paths; + +public class CustomFileReaderTest extends UnitBase { + + @Test() + public void givenWrongFile_whenRun1_thenException() { + String file = "src/main/resources/custom_file_reader/djfhghdjfg.txt"; + Assertions.assertThrows(IOException.class, () -> { + new CustomFileReader(file).run1(); + }); + } + + @Test + public void givenEmptyFile_whenRun1_thenEmpty() throws IOException { + String file = "src/main/resources/custom_file_reader/emptyFileForTests.txt"; + new CustomFileReader(file).run1(); + assertEquals("", getOutput()); + } + + @Test + public void givenFileDotsCommasOnly_whenRun1_thenEmpty() throws IOException { + String file = "src/main/resources/custom_file_reader/fileDotsCommasOnly.txt"; + new CustomFileReader(file).run1(); + assertEquals("", getOutput()); + } + + @Test + public void givenTextFile_whenRun1_thenNewText() throws IOException { + String file = "src/main/resources/custom_file_reader/fileTest.txt"; + new CustomFileReader(file).run1(); + assertEquals("dfgdfgdgdgdfggdfgdfgfdgdfgfgfdgdfgdfgdfgdfg", getOutput()); + } + + @Test() + public void givenWrongFile_whenRun2_thenException() { + String file = "src/main/resources/custom_file_reader/djfhghdjfg.txt"; + Assertions.assertThrows(FileNotFoundException.class, () -> { + new CustomFileReader(file).run2(); + }); + } + + @Test + public void givenEmptyFile_whenRun2_thenEmpty() throws FileNotFoundException { + String file = "src/main/resources/custom_file_reader/emptyFileForTests.txt"; + new CustomFileReader(file).run2(); + assertEquals("", getOutput()); + } + + @Test + public void givenFileDotsCommasOnly_whenRun2_thenEmpty() throws FileNotFoundException { + String file = "src/main/resources/custom_file_reader/fileDotsCommasOnly.txt"; + new CustomFileReader(file).run2(); + assertEquals("", getOutput()); + } + + @Test + public void givenTextFile_whenRun2_thenNewText() throws FileNotFoundException { + String file = "src/main/resources/custom_file_reader/fileTest.txt"; + new CustomFileReader(file).run2(); + assertEquals("dfgdfgdgdgdfggdfgdfgfdgdfgfgfdgdfgdfgdfgdfg", getOutput()); + } + + @Test() + public void givenWrongFile_whenRun3_thenException() { + Path path = Paths.get("src/main/resources/custom_file_reader/fhfghfghfgh.txt");; + Assertions.assertThrows(IOException.class, () -> { + new CustomFileReader(path).run3(); + }); + } + + @Test + public void givenEmptyFile_whenRun3_thenEmpty() throws IOException { + Path path = Paths.get("src/main/resources/custom_file_reader/emptyFileForTests.txt");; + new CustomFileReader(path).run3(); + assertEquals("", getOutput()); } + + @Test + public void givenFileDotsCommasOnly_whenRun3_thenEmpty() throws IOException { + Path path = Paths.get("src/main/resources/custom_file_reader/fileDotsCommasOnly.txt");; + new CustomFileReader(path).run3(); + assertEquals("", getOutput()); + } + + @Test + public void givenTextFile_whenRun3_thenNewText() throws IOException { + Path path = Paths.get("src/main/resources/custom_file_reader/fileTest.txt");; + new CustomFileReader(path).run3(); + assertEquals("dfgdfgdgdgdfggdfgdfgfdgdfgfgfdgdfgdfgdfgdfg", getOutput()); + } + + @Test() + public void givenWrongFile_whenRun4_thenException() { + Path path = Paths.get("src/main/resources/custom_file_reader/fhfghfghfgh.txt");; + Assertions.assertThrows(IOException.class, () -> { + new CustomFileReader(path).run4(); + }); + } + + @Test + public void givenEmptyFile_whenRun4_thenEmpty() throws IOException { + Path path = Paths.get("src/main/resources/custom_file_reader/emptyFileForTests.txt");; + new CustomFileReader(path).run4(); + assertEquals("", getOutput()); + } + + @Test + public void givenFileDotsCommasOnly_whenRun4_thenEmpty() throws IOException { + Path path = Paths.get("src/main/resources/custom_file_reader/fileDotsCommasOnly.txt");; + new CustomFileReader(path).run4(); + assertEquals("", getOutput()); + } + + @Test + public void givenTextFile_whenRun4_thenNewText() throws IOException { + Path path = Paths.get("src/main/resources/custom_file_reader/fileTest.txt");; + new CustomFileReader(path).run4(); + assertEquals("dfgdfgdgdgdfggdfgdfgfdgdfgfgfdgdfgdfgdfgdfg", getOutput()); + } + + @Test() + public void givenWrongFile_whenRun5_thenException() { + String file = "src/main/resources/custom_file_reader/djfhghdjfg.txt"; + Assertions.assertThrows(IOException.class, () -> { + new CustomFileReader(file).run5(); + }); + } + + @Test + public void givenEmptyFile_whenRun5_thenEmpty() throws IOException { + String file = "src/main/resources/custom_file_reader/emptyFileForTests.txt"; + new CustomFileReader(file).run5(); + assertEquals("", getOutput()); + } + + @Test + public void givenFileDotsCommasOnly_whenRun5_thenEmpty() throws IOException { + String file = "src/main/resources/custom_file_reader/fileDotsCommasOnly.txt"; + new CustomFileReader(file).run5(); + assertEquals("", getOutput()); + } + + @Test + public void givenTextFile_whenRun5_thenNewText() throws IOException { + String file = "src/main/resources/custom_file_reader/fileTest.txt"; + new CustomFileReader(file).run5(); + assertEquals("dfgdfgdgdgdfggdfgdfgfdgdfgfgfdgdfgdfgdfgdfg", getOutput()); + } + } From faade02bbeb795bec70f0239f327a3afd992d3d7 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 8 Aug 2021 21:49:03 +0300 Subject: [PATCH 33/50] Add Singleton task --- src/main/java/homework_4/singleton/Main.java | 21 ++++++++++++++ .../java/homework_4/singleton/Singleton.java | 28 +++++++++++++++++++ .../CustomFileReaderTest.java | 24 ++++++++++------ 3 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 src/main/java/homework_4/singleton/Main.java create mode 100644 src/main/java/homework_4/singleton/Singleton.java diff --git a/src/main/java/homework_4/singleton/Main.java b/src/main/java/homework_4/singleton/Main.java new file mode 100644 index 00000000..33efa4d1 --- /dev/null +++ b/src/main/java/homework_4/singleton/Main.java @@ -0,0 +1,21 @@ +package homework_4.singleton; + +public class Main { + public static void main(String[] args) { + Singleton object1 = Singleton.getInstance(); + if (object1 != null) { + object1.Set(100); + object1.Print(); + } else { + System.out.println("object 1 is null"); + } + + Singleton object2 = Singleton.getInstance(); + if (object2 != null) { + object2.Set(999); + object2.Print(); + } else { + System.out.println("object 2 is null"); + } + } +} diff --git a/src/main/java/homework_4/singleton/Singleton.java b/src/main/java/homework_4/singleton/Singleton.java new file mode 100644 index 00000000..3f00404c --- /dev/null +++ b/src/main/java/homework_4/singleton/Singleton.java @@ -0,0 +1,28 @@ +package homework_4.singleton; + +public class Singleton { + private static Singleton instance = null; + private int x; + + private Singleton() { + x = 0; + } + + public static Singleton getInstance() { + if (instance == null) { + instance = new Singleton(); + return instance; + } else { + return null; + } + + } + + public void Set(int newX) { + x = newX; + } + + public void Print() { + System.out.println("x = " + x); + } +} diff --git a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java index b41d1f15..09a3c161 100644 --- a/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java +++ b/src/test/java/homework_4/custom_file_reader/CustomFileReaderTest.java @@ -73,7 +73,8 @@ public void givenTextFile_whenRun2_thenNewText() throws FileNotFoundException { @Test() public void givenWrongFile_whenRun3_thenException() { - Path path = Paths.get("src/main/resources/custom_file_reader/fhfghfghfgh.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/fhfghfghfgh.txt"); + ; Assertions.assertThrows(IOException.class, () -> { new CustomFileReader(path).run3(); }); @@ -81,28 +82,32 @@ public void givenWrongFile_whenRun3_thenException() { @Test public void givenEmptyFile_whenRun3_thenEmpty() throws IOException { - Path path = Paths.get("src/main/resources/custom_file_reader/emptyFileForTests.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/emptyFileForTests.txt"); + ; new CustomFileReader(path).run3(); assertEquals("", getOutput()); } @Test public void givenFileDotsCommasOnly_whenRun3_thenEmpty() throws IOException { - Path path = Paths.get("src/main/resources/custom_file_reader/fileDotsCommasOnly.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/fileDotsCommasOnly.txt"); + ; new CustomFileReader(path).run3(); assertEquals("", getOutput()); } @Test public void givenTextFile_whenRun3_thenNewText() throws IOException { - Path path = Paths.get("src/main/resources/custom_file_reader/fileTest.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/fileTest.txt"); + ; new CustomFileReader(path).run3(); assertEquals("dfgdfgdgdgdfggdfgdfgfdgdfgfgfdgdfgdfgdfgdfg", getOutput()); } @Test() public void givenWrongFile_whenRun4_thenException() { - Path path = Paths.get("src/main/resources/custom_file_reader/fhfghfghfgh.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/fhfghfghfgh.txt"); + ; Assertions.assertThrows(IOException.class, () -> { new CustomFileReader(path).run4(); }); @@ -110,21 +115,24 @@ public void givenWrongFile_whenRun4_thenException() { @Test public void givenEmptyFile_whenRun4_thenEmpty() throws IOException { - Path path = Paths.get("src/main/resources/custom_file_reader/emptyFileForTests.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/emptyFileForTests.txt"); + ; new CustomFileReader(path).run4(); assertEquals("", getOutput()); } @Test public void givenFileDotsCommasOnly_whenRun4_thenEmpty() throws IOException { - Path path = Paths.get("src/main/resources/custom_file_reader/fileDotsCommasOnly.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/fileDotsCommasOnly.txt"); + ; new CustomFileReader(path).run4(); assertEquals("", getOutput()); } @Test public void givenTextFile_whenRun4_thenNewText() throws IOException { - Path path = Paths.get("src/main/resources/custom_file_reader/fileTest.txt");; + Path path = Paths.get("src/main/resources/custom_file_reader/fileTest.txt"); + ; new CustomFileReader(path).run4(); assertEquals("dfgdfgdgdgdfggdfgdfgfdgdfgfgfdgdfgdfgdfgdfg", getOutput()); } From 7091eedfe4c1ef588c376eee218c378b6069cbc0 Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 8 Aug 2021 23:36:31 +0300 Subject: [PATCH 34/50] Finish Singleton task Add test for it --- src/main/java/homework_4/singleton/Main.java | 4 ++-- .../java/homework_4/singleton/Singleton.java | 13 ++++++------- .../java/homework_4/singleton/SingletonTest.java | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 src/test/java/homework_4/singleton/SingletonTest.java diff --git a/src/main/java/homework_4/singleton/Main.java b/src/main/java/homework_4/singleton/Main.java index 33efa4d1..517e3f7c 100644 --- a/src/main/java/homework_4/singleton/Main.java +++ b/src/main/java/homework_4/singleton/Main.java @@ -2,7 +2,7 @@ public class Main { public static void main(String[] args) { - Singleton object1 = Singleton.getInstance(); + Singleton object1 = Singleton.getInstance("hey"); if (object1 != null) { object1.Set(100); object1.Print(); @@ -10,7 +10,7 @@ public static void main(String[] args) { System.out.println("object 1 is null"); } - Singleton object2 = Singleton.getInstance(); + Singleton object2 = Singleton.getInstance("hey"); if (object2 != null) { object2.Set(999); object2.Print(); diff --git a/src/main/java/homework_4/singleton/Singleton.java b/src/main/java/homework_4/singleton/Singleton.java index 3f00404c..a60f8e59 100644 --- a/src/main/java/homework_4/singleton/Singleton.java +++ b/src/main/java/homework_4/singleton/Singleton.java @@ -3,19 +3,18 @@ public class Singleton { private static Singleton instance = null; private int x; + public String value; - private Singleton() { + private Singleton(String value) { x = 0; + this.value = value; } - public static Singleton getInstance() { + public static Singleton getInstance(String value) { if (instance == null) { - instance = new Singleton(); - return instance; - } else { - return null; + instance = new Singleton(value); } - + return instance; } public void Set(int newX) { diff --git a/src/test/java/homework_4/singleton/SingletonTest.java b/src/test/java/homework_4/singleton/SingletonTest.java new file mode 100644 index 00000000..eef822b7 --- /dev/null +++ b/src/test/java/homework_4/singleton/SingletonTest.java @@ -0,0 +1,16 @@ +package homework_4.singleton; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class SingletonTest { + + @Test + public void givenSingleton_whenCreateTwo_thenSameValues() { + Singleton singleton = Singleton.getInstance("Dog"); + Singleton anotherSingleton = Singleton.getInstance("Cat"); + assertEquals(singleton.value, anotherSingleton.value); + } + +} From fa0e484f00477d2bd1abf70c3efadc45dea8447c Mon Sep 17 00:00:00 2001 From: vrodina Date: Sun, 8 Aug 2021 23:45:41 +0300 Subject: [PATCH 35/50] Update README with hw4 Add classes for CustomAnnotation task --- README.md | 5 ++++- .../java/homework_4/custom_annotation/CustomAnnotation.java | 4 ++++ src/test/java/homework_4/custom_annotation/Main.java | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/test/java/homework_4/custom_annotation/CustomAnnotation.java create mode 100644 src/test/java/homework_4/custom_annotation/Main.java diff --git a/README.md b/README.md index 1a1a4587..8c0f7610 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,9 @@ | HW2_2 | [Pyramid printer](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2/pyramid_printer) | The app that reads the number from the command line and print a pyramid with levels according to this number, this pyramid consists only of 'x' symbols | | HW2_3 | [Random chars table](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_2/random_chars_table) | The app that reads 2 numbers as size of a table and a strategy: even or odd, print this table consisting of random symbols from A to Z and then print all symbols in one line which are odd or even according to the strategy (their ASCII codes) | | HW_3 | [Immutable class](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_3) | Immutable class with fields (including reference type), several constructors, method which return new object and requirements for Immutable class in comments | - +| HW_4_1 | [Custom File Reader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/custom_file_reader) | The app which gets data from file and then print it without any commas and dots (there are different ways for reading from a file) | +| HW_4_2 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/singleton) | The app - singleton | +| HW_4_3 | [Custom annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/custom_annotation) | A custom annotation | + [Link to Coding Bat](https://codingbat.com/done?user=lerarodina24@gmail.com&tag=9318549243) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/test/java/homework_4/custom_annotation/CustomAnnotation.java b/src/test/java/homework_4/custom_annotation/CustomAnnotation.java new file mode 100644 index 00000000..5ba8cb29 --- /dev/null +++ b/src/test/java/homework_4/custom_annotation/CustomAnnotation.java @@ -0,0 +1,4 @@ +package homework_4.custom_annotation; + +public class CustomAnnotation { +} diff --git a/src/test/java/homework_4/custom_annotation/Main.java b/src/test/java/homework_4/custom_annotation/Main.java new file mode 100644 index 00000000..f64bd82b --- /dev/null +++ b/src/test/java/homework_4/custom_annotation/Main.java @@ -0,0 +1,4 @@ +package homework_4.custom_annotation; + +public class Main { +} From ad3d16a511e49cb6ccc7e16aa3f1fd0b1486c2c9 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 9 Aug 2021 01:39:15 +0300 Subject: [PATCH 36/50] Add CustomAnnotation task Add tests for it --- .../homework_4/custom_annotation/Init.java | 12 ++++ .../custom_annotation/JsonElement.java | 12 ++++ .../custom_annotation/JsonSerializable.java | 12 ++++ .../JsonSerializationException.java | 10 +++ .../ObjectToJsonConverter.java | 67 +++++++++++++++++++ .../homework_4/custom_annotation/Person.java | 65 ++++++++++++++++++ src/main/java/homework_4/singleton/Main.java | 2 +- .../java/homework_4/singleton/Singleton.java | 2 +- .../RandomCharsTableTest.java | 27 -------- .../custom_annotation/CustomAnnotation.java | 4 -- .../CustomAnnotationTest.java | 27 ++++++++ .../homework_4/custom_annotation/Main.java | 4 -- 12 files changed, 207 insertions(+), 37 deletions(-) create mode 100644 src/main/java/homework_4/custom_annotation/Init.java create mode 100644 src/main/java/homework_4/custom_annotation/JsonElement.java create mode 100644 src/main/java/homework_4/custom_annotation/JsonSerializable.java create mode 100644 src/main/java/homework_4/custom_annotation/JsonSerializationException.java create mode 100644 src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java create mode 100644 src/main/java/homework_4/custom_annotation/Person.java delete mode 100644 src/test/java/homework_4/custom_annotation/CustomAnnotation.java create mode 100644 src/test/java/homework_4/custom_annotation/CustomAnnotationTest.java delete mode 100644 src/test/java/homework_4/custom_annotation/Main.java diff --git a/src/main/java/homework_4/custom_annotation/Init.java b/src/main/java/homework_4/custom_annotation/Init.java new file mode 100644 index 00000000..1e872b88 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/Init.java @@ -0,0 +1,12 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Init { + +} diff --git a/src/main/java/homework_4/custom_annotation/JsonElement.java b/src/main/java/homework_4/custom_annotation/JsonElement.java new file mode 100644 index 00000000..db4fd7b8 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/JsonElement.java @@ -0,0 +1,12 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface JsonElement { + public String key() default ""; +} diff --git a/src/main/java/homework_4/custom_annotation/JsonSerializable.java b/src/main/java/homework_4/custom_annotation/JsonSerializable.java new file mode 100644 index 00000000..76be1fa9 --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/JsonSerializable.java @@ -0,0 +1,12 @@ +package homework_4.custom_annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface JsonSerializable { + +} diff --git a/src/main/java/homework_4/custom_annotation/JsonSerializationException.java b/src/main/java/homework_4/custom_annotation/JsonSerializationException.java new file mode 100644 index 00000000..61b2be3f --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/JsonSerializationException.java @@ -0,0 +1,10 @@ +package homework_4.custom_annotation; + +public class JsonSerializationException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public JsonSerializationException(String message) { + super(message); + } +} diff --git a/src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java b/src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java new file mode 100644 index 00000000..44af575b --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/ObjectToJsonConverter.java @@ -0,0 +1,67 @@ +package homework_4.custom_annotation; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +public class ObjectToJsonConverter { + public String convertToJson(Object object) throws JsonSerializationException { + try { + + checkIfSerializable(object); + initializeObject(object); + return getJsonString(object); + + } catch (Exception e) { + throw new JsonSerializationException(e.getMessage()); + } + } + + private void checkIfSerializable(Object object) { + if (Objects.isNull(object)) { + throw new JsonSerializationException("Can't serialize a null object"); + } + + Class clazz = object.getClass(); + if (!clazz.isAnnotationPresent(JsonSerializable.class)) { + throw new JsonSerializationException("The class " + clazz.getSimpleName() + " is not annotated with JsonSerializable"); + } + } + + private void initializeObject(Object object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Class clazz = object.getClass(); + for (Method method : clazz.getDeclaredMethods()) { + if (method.isAnnotationPresent(Init.class)) { + method.setAccessible(true); + method.invoke(object); + } + } + } + + private String getJsonString(Object object) throws IllegalArgumentException, IllegalAccessException { + Class clazz = object.getClass(); + Map jsonElementsMap = new HashMap<>(); + for (Field field : clazz.getDeclaredFields()) { + field.setAccessible(true); + if (field.isAnnotationPresent(JsonElement.class)) { + jsonElementsMap.put(getKey(field), (String) field.get(object)); + } + } + + String jsonString = jsonElementsMap.entrySet() + .stream() + .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"") + .collect(Collectors.joining(",")); + return "{" + jsonString + "}"; + } + + private String getKey(Field field) { + String value = field.getAnnotation(JsonElement.class) + .key(); + return value.isEmpty() ? field.getName() : value; + } +} diff --git a/src/main/java/homework_4/custom_annotation/Person.java b/src/main/java/homework_4/custom_annotation/Person.java new file mode 100644 index 00000000..f442239e --- /dev/null +++ b/src/main/java/homework_4/custom_annotation/Person.java @@ -0,0 +1,65 @@ +package homework_4.custom_annotation; + +@JsonSerializable +public class Person { + @JsonElement + private String firstName; + @JsonElement + private String lastName; + @JsonElement(key = "personAge") + private String age; + + private String address; + + public Person(String firstName, String lastName) { + super(); + this.firstName = firstName; + this.lastName = lastName; + } + + public Person(String firstName, String lastName, String age) { + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + } + + @Init + private void initNames() { + this.firstName = this.firstName.substring(0, 1) + .toUpperCase() + this.firstName.substring(1); + this.lastName = this.lastName.substring(0, 1) + .toUpperCase() + this.lastName.substring(1); + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/src/main/java/homework_4/singleton/Main.java b/src/main/java/homework_4/singleton/Main.java index 517e3f7c..3e868e3b 100644 --- a/src/main/java/homework_4/singleton/Main.java +++ b/src/main/java/homework_4/singleton/Main.java @@ -10,7 +10,7 @@ public static void main(String[] args) { System.out.println("object 1 is null"); } - Singleton object2 = Singleton.getInstance("hey"); + Singleton object2 = Singleton.getInstance("hello"); if (object2 != null) { object2.Set(999); object2.Print(); diff --git a/src/main/java/homework_4/singleton/Singleton.java b/src/main/java/homework_4/singleton/Singleton.java index a60f8e59..d5c9126d 100644 --- a/src/main/java/homework_4/singleton/Singleton.java +++ b/src/main/java/homework_4/singleton/Singleton.java @@ -1,7 +1,7 @@ package homework_4.singleton; public class Singleton { - private static Singleton instance = null; + private static Singleton instance; private int x; public String value; diff --git a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java index 9a711990..d87c9adf 100644 --- a/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java +++ b/src/test/java/homework_2/random_chars_table/RandomCharsTableTest.java @@ -27,33 +27,6 @@ void NullSizeInputTest() { getOutputLines()[0]); } -// @Test -// void EvenStrategyInputTest() { -// setInput("3 4 even"); -// -// new RandomCharsTable().run(); -// removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); -// assertEquals(); -// } -// -// @Test -// void OddStrategyInputTest() { -// setInput("5 4 odd"); -// -// new RandomCharsTable().run(); -// removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); -// assertEquals(); -// } -// -// @Test -// void TableWithSizeOneInputTest() { -// setInput("1 1 even"); -// -// new RandomCharsTable().run(); -// removeFromOutput("Please type size of a table: 2 numbers and strategy - even or odd:"); -// assertEquals(); -// } - @Test void NegativeInputTest() { setInput("-3 4 even"); diff --git a/src/test/java/homework_4/custom_annotation/CustomAnnotation.java b/src/test/java/homework_4/custom_annotation/CustomAnnotation.java deleted file mode 100644 index 5ba8cb29..00000000 --- a/src/test/java/homework_4/custom_annotation/CustomAnnotation.java +++ /dev/null @@ -1,4 +0,0 @@ -package homework_4.custom_annotation; - -public class CustomAnnotation { -} diff --git a/src/test/java/homework_4/custom_annotation/CustomAnnotationTest.java b/src/test/java/homework_4/custom_annotation/CustomAnnotationTest.java new file mode 100644 index 00000000..e2ba7526 --- /dev/null +++ b/src/test/java/homework_4/custom_annotation/CustomAnnotationTest.java @@ -0,0 +1,27 @@ +package homework_4.custom_annotation; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class CustomAnnotationTest { + + @Test + public void givenObjectNotSerializedThenExceptionThrown() throws JsonSerializationException { + Object object = new Object(); + ObjectToJsonConverter serializer = new ObjectToJsonConverter(); + assertThrows(JsonSerializationException.class, () -> { + serializer.convertToJson(object); + }); + } + + @Test + public void givenObjectSerializedThenTrueReturned() throws JsonSerializationException { + Person person = new Person("John", "Ivanov", "50"); + ObjectToJsonConverter serializer = new ObjectToJsonConverter(); + String jsonString = serializer.convertToJson(person); + assertEquals( + "{\"personAge\":\"50\",\"firstName\":\"John\",\"lastName\":\"Ivanov\"}", + jsonString); + } +} diff --git a/src/test/java/homework_4/custom_annotation/Main.java b/src/test/java/homework_4/custom_annotation/Main.java deleted file mode 100644 index f64bd82b..00000000 --- a/src/test/java/homework_4/custom_annotation/Main.java +++ /dev/null @@ -1,4 +0,0 @@ -package homework_4.custom_annotation; - -public class Main { -} From 06821ce83d62e22bb45c5eccf68f3a177e256d4b Mon Sep 17 00:00:00 2001 From: vrodina Date: Tue, 31 Aug 2021 23:58:34 +0300 Subject: [PATCH 37/50] Add power of number task for hw5 + tests and readme --- README.md | 2 + build.gradle | 2 + .../CustomRegexMatcher.java | 4 ++ .../homework_5/custom_regex_matcher/Main.java | 4 ++ .../java/homework_5/power_of_number/Main.java | 7 +++ .../power_of_number/PowerOfNumber.java | 32 ++++++++++ .../power_of_number/PowerOfNumberTest.java | 62 +++++++++++++++++++ 7 files changed, 113 insertions(+) create mode 100644 src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java create mode 100644 src/main/java/homework_5/custom_regex_matcher/Main.java create mode 100644 src/main/java/homework_5/power_of_number/Main.java create mode 100644 src/main/java/homework_5/power_of_number/PowerOfNumber.java create mode 100644 src/test/java/homework_5/power_of_number/PowerOfNumberTest.java diff --git a/README.md b/README.md index 8c0f7610..a9971603 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ | HW_4_1 | [Custom File Reader](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/custom_file_reader) | The app which gets data from file and then print it without any commas and dots (there are different ways for reading from a file) | | HW_4_2 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/singleton) | The app - singleton | | HW_4_3 | [Custom annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/custom_annotation) | A custom annotation | +| HW_5_1 | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_5/power_of_number) | The app which read number and its power and calculate the result. Recursion should be used here | + [Link to Coding Bat](https://codingbat.com/done?user=lerarodina24@gmail.com&tag=9318549243) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/build.gradle b/build.gradle index b91dc843..a6a33e64 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,8 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.0' + } test { diff --git a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java new file mode 100644 index 00000000..9a88174b --- /dev/null +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -0,0 +1,4 @@ +package homework_5.custom_regex_matcher; + +public class CustomRegexMatcher { +} diff --git a/src/main/java/homework_5/custom_regex_matcher/Main.java b/src/main/java/homework_5/custom_regex_matcher/Main.java new file mode 100644 index 00000000..fdf993d2 --- /dev/null +++ b/src/main/java/homework_5/custom_regex_matcher/Main.java @@ -0,0 +1,4 @@ +package homework_5.custom_regex_matcher; + +public class Main { +} diff --git a/src/main/java/homework_5/power_of_number/Main.java b/src/main/java/homework_5/power_of_number/Main.java new file mode 100644 index 00000000..930f2040 --- /dev/null +++ b/src/main/java/homework_5/power_of_number/Main.java @@ -0,0 +1,7 @@ +package homework_5.power_of_number; + +public class Main { + public static void main(String[] args) { + new PowerOfNumber().run(); + } +} diff --git a/src/main/java/homework_5/power_of_number/PowerOfNumber.java b/src/main/java/homework_5/power_of_number/PowerOfNumber.java new file mode 100644 index 00000000..1298d536 --- /dev/null +++ b/src/main/java/homework_5/power_of_number/PowerOfNumber.java @@ -0,0 +1,32 @@ +package homework_5.power_of_number; + +import java.util.Scanner; + +public class PowerOfNumber { + + private static final String ERR_MESSAGE = "Only 2 non-negative integers are allowed"; + + public void run() { + System.out.println("Please enter number and power of this number: "); + String inputString = ""; + try (Scanner scanner = new Scanner(System.in)) { + if (scanner.hasNextLine()) { + inputString = scanner.nextLine().trim(); + } + if (!inputString.matches("\\d+\\s+\\d+")) { + System.out.println(ERR_MESSAGE); + } else { + int number = Integer.parseInt(inputString.split("\\s+")[0]); + int power = Integer.parseInt(inputString.split("\\s+")[1]); + System.out.println(powerOfN(number, power)); + } + } + } + + private int powerOfN(int number, int pow) { + if (pow == 0) { + return 1; + } + return powerOfN(number, pow - 1) * number; + } +} diff --git a/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java new file mode 100644 index 00000000..a06295ea --- /dev/null +++ b/src/test/java/homework_5/power_of_number/PowerOfNumberTest.java @@ -0,0 +1,62 @@ +package homework_5.power_of_number; + +import base.UnitBase; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class PowerOfNumberTest extends UnitBase { + @ParameterizedTest + @MethodSource("validInput") + void ValidInput(String input, String result) { + setInput(input); + + new PowerOfNumber().run(); + printOut(); + removeFromOutput("Please enter number and power of this number: "); + + assertEquals(getOutput(), result); + } + + @ParameterizedTest + @MethodSource("invalidInput") + void InvalidInput(String input) { + setInput(input); + + new PowerOfNumber().run(); + printOut(); + removeFromOutput("Please enter number and power of this number: "); + + assertTrue(getOutput().contains("Only 2 non-negative integers are allowed")); + } + + private static Stream validInput() { + return Stream.of( + Arguments.of("2 2", "4"), + Arguments.of("2 1", "2"), + Arguments.of("2 0", "1"), + Arguments.of("0 2", "0"), + Arguments.of("0 0", "1"), + Arguments.of("10 2", "100"), + Arguments.of("2 10", "1024") + ); + } + + private static Stream invalidInput() { + return Stream.of( + Arguments.of("-300 1"), + Arguments.of("1 -300"), + Arguments.of("-30 -30"), + Arguments.of("hello"), + Arguments.of("one two"), + Arguments.of("1 2 3 4"), + Arguments.of("10"), + Arguments.of(" ") + ); + } +} From d3852d86bc9f54c097f5744801ebfc414b33fbf6 Mon Sep 17 00:00:00 2001 From: vrodina Date: Wed, 1 Sep 2021 00:36:17 +0300 Subject: [PATCH 38/50] Add CustomRegexMatcher task, update readme, create test directory --- README.md | 2 +- .../CustomRegexMatcher.java | 17 +++++++++++++++++ .../homework_5/custom_regex_matcher/Main.java | 3 +++ .../CustomRegexMatcherTest.java | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java diff --git a/README.md b/README.md index a9971603..29cfcc34 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ | HW_4_2 | [Singleton](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/singleton) | The app - singleton | | HW_4_3 | [Custom annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/custom_annotation) | A custom annotation | | HW_5_1 | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_5/power_of_number) | The app which read number and its power and calculate the result. Recursion should be used here | - +| HW_5_2 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_5/custom_regex_matcher) | The app which read string and and check if this string matches with hardcoded regex in the app and get result: true or false | [Link to Coding Bat](https://codingbat.com/done?user=lerarodina24@gmail.com&tag=9318549243) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java index 9a88174b..1614132e 100644 --- a/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java +++ b/src/main/java/homework_5/custom_regex_matcher/CustomRegexMatcher.java @@ -1,4 +1,21 @@ package homework_5.custom_regex_matcher; +import java.util.Scanner; + public class CustomRegexMatcher { + public void run() { + System.out.println("Please enter a valid ipv4 address: "); + String address = ""; + try (Scanner scanner = new Scanner(System.in)) { + if (scanner.hasNextLine()) { + address = scanner.nextLine().trim(); + } + System.out.println(isipv4Addr(address)); + } + } + + private boolean isipv4Addr(String s) { + String regex = "^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?)$"; + return s.matches(regex); + } } diff --git a/src/main/java/homework_5/custom_regex_matcher/Main.java b/src/main/java/homework_5/custom_regex_matcher/Main.java index fdf993d2..f8b52c06 100644 --- a/src/main/java/homework_5/custom_regex_matcher/Main.java +++ b/src/main/java/homework_5/custom_regex_matcher/Main.java @@ -1,4 +1,7 @@ package homework_5.custom_regex_matcher; public class Main { + public static void main(String[] args) { + new CustomRegexMatcher().run(); + } } diff --git a/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java new file mode 100644 index 00000000..59c66640 --- /dev/null +++ b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java @@ -0,0 +1,4 @@ +package homework_5.custom_regex_matcher; + +public class CustomRegexMatcherTest { +} From 2d1f91b5343f160e2072fd5326e4457dabb9e8d4 Mon Sep 17 00:00:00 2001 From: vrodina Date: Wed, 1 Sep 2021 00:51:31 +0300 Subject: [PATCH 39/50] Add tests for CustomRegexMatcher task --- .../CustomRegexMatcherTest.java | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java index 59c66640..160af559 100644 --- a/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java +++ b/src/test/java/homework_5/custom_regex_matcher/CustomRegexMatcherTest.java @@ -1,4 +1,60 @@ package homework_5.custom_regex_matcher; -public class CustomRegexMatcherTest { +import base.UnitBase; +import homework_5.power_of_number.PowerOfNumber; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class CustomRegexMatcherTest extends UnitBase { + @ParameterizedTest + @MethodSource("validInput") + void ValidInput(String input) { + setInput(input); + + new CustomRegexMatcher().run(); + printOut(); + removeFromOutput("Please enter a valid ipv4 address: "); + + assertEquals(getOutput(), "true"); + } + + @ParameterizedTest + @MethodSource("invalidInput") + void InvalidInput(String input) { + setInput(input); + + new CustomRegexMatcher().run(); + printOut(); + removeFromOutput("Please enter a valid ipv4 address: "); + + assertEquals(getOutput(), "false"); + } + + private static Stream validInput() { + return Stream.of( + Arguments.of("172.16.254.1"), + Arguments.of("255.255.255.255"), + Arguments.of("172.21.118.45"), + Arguments.of("0.0.0.3"), + Arguments.of("192.168.0.17") + ); + } + + private static Stream invalidInput() { + return Stream.of( + Arguments.of("1.2.3.0"), + Arguments.of("0.0.0.256"), + Arguments.of("x.y.z.t"), + Arguments.of("1...1"), + Arguments.of("1.1.1"), + Arguments.of("1.1.1.1.1"), + Arguments.of("1000.1.1.1"), + Arguments.of("1.2.3.04") + ); + } } From 3194d8116e80c5ac75bc13f46745a1d0f1d6c8ff Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 6 Sep 2021 23:45:32 +0300 Subject: [PATCH 40/50] Add MapProblemsGenerator task --- .../map_problems_generator/Main.java | 22 ++++++++++ .../MapProblemsCollisionGenerator.java | 41 +++++++++++++++++++ .../MapProblemsMutableGenerator.java | 32 +++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 src/main/java/homework_6/map_problems_generator/Main.java create mode 100644 src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java create mode 100644 src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java diff --git a/src/main/java/homework_6/map_problems_generator/Main.java b/src/main/java/homework_6/map_problems_generator/Main.java new file mode 100644 index 00000000..39a95b25 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/Main.java @@ -0,0 +1,22 @@ +package homework_6.map_problems_generator; + +import java.util.HashMap; + +public class Main { + public static void main(String[] args) { + HashMap, String> container_problems_coll_gen = new HashMap<>(); + container_problems_coll_gen.put(new MapProblemsCollisionGenerator<>("one", "one"), "one"); + container_problems_coll_gen.put(new MapProblemsCollisionGenerator<>("two", "two"), "two"); + + String resultTwo_1 = container_problems_coll_gen.get(new MapProblemsCollisionGenerator<>("two", "two")); + + + + HashMap, String> container_mutable_gen = new HashMap<>(); + container_mutable_gen.put(new MapProblemsMutableGenerator<>("one"), "one"); + container_mutable_gen.put(new MapProblemsMutableGenerator<>("two"), "two"); + + String resultTwo_2 = container_mutable_gen.get(new MapProblemsMutableGenerator<>("two")); + } + +} diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java new file mode 100644 index 00000000..867f93f4 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java @@ -0,0 +1,41 @@ +package homework_6.map_problems_generator; + +public class MapProblemsCollisionGenerator{ + private F1 f1; + private F2 f2; + + public MapProblemsCollisionGenerator(F1 f1, F2 f2) { + this.f1 = f1; + this.f2 = f2; + } + + public F1 getF1() { + return f1; + } + + public F2 getF2() { + return f2; + } + + public void setF1(F1 f1) { + this.f1 = f1; + } + + public void setF2(F2 f2) { + this.f2 = f2; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MapProblemsCollisionGenerator that = (MapProblemsCollisionGenerator) o; + return f1.equals(that.f1) && + f2.equals(that.f2); + } + + @Override + public final int hashCode() { + return 1; + } +} diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java new file mode 100644 index 00000000..614c2eb9 --- /dev/null +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java @@ -0,0 +1,32 @@ +package homework_6.map_problems_generator; + +import java.util.Objects; + +public class MapProblemsMutableGenerator { + private F1 f1; + + public MapProblemsMutableGenerator(F1 f1) { + this.f1 = f1; + } + + public F1 getF1() { + return f1; + } + + public void setF1(F1 f1) { + this.f1 = f1; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MapProblemsMutableGenerator that = (MapProblemsMutableGenerator) o; + return f1.equals(that.f1); + } + + @Override + public final int hashCode() { + return Objects.hashCode(f1); + } +} From a493b9f5f9b569afe82e9259a897414373dbaa91 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 20 Sep 2021 00:38:32 +0300 Subject: [PATCH 41/50] Update README.md Add empty structure for hw 7 task --- README.md | 2 ++ src/main/java/homework_7/Cat.java | 4 ++++ src/main/java/homework_7/Kitten.java | 4 ++++ src/main/java/homework_7/KittenToCatFunction.java | 4 ++++ src/main/java/homework_7/Main.java | 4 ++++ 5 files changed, 18 insertions(+) create mode 100644 src/main/java/homework_7/Cat.java create mode 100644 src/main/java/homework_7/Kitten.java create mode 100644 src/main/java/homework_7/KittenToCatFunction.java create mode 100644 src/main/java/homework_7/Main.java diff --git a/README.md b/README.md index 29cfcc34..3c26fae0 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ | HW_4_3 | [Custom annotation](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_4/custom_annotation) | A custom annotation | | HW_5_1 | [Power Of Number](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_5/power_of_number) | The app which read number and its power and calculate the result. Recursion should be used here | | HW_5_2 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_5/custom_regex_matcher) | The app which read string and and check if this string matches with hardcoded regex in the app and get result: true or false | +| HW_6 | [Map Problems Generator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_6/map_problems_generator) | The app which create collisions in hashmap | +| HW_7 | [Kitten To Cat Function Interface](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_7/kitten_to_cat_function) | The app which create an interface for turning a kitten into a cat | [Link to Coding Bat](https://codingbat.com/done?user=lerarodina24@gmail.com&tag=9318549243) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/homework_7/Cat.java b/src/main/java/homework_7/Cat.java new file mode 100644 index 00000000..de1dd35f --- /dev/null +++ b/src/main/java/homework_7/Cat.java @@ -0,0 +1,4 @@ +package homework_7; + +public class Cat { +} diff --git a/src/main/java/homework_7/Kitten.java b/src/main/java/homework_7/Kitten.java new file mode 100644 index 00000000..e55d5478 --- /dev/null +++ b/src/main/java/homework_7/Kitten.java @@ -0,0 +1,4 @@ +package homework_7; + +public class Kitten { +} diff --git a/src/main/java/homework_7/KittenToCatFunction.java b/src/main/java/homework_7/KittenToCatFunction.java new file mode 100644 index 00000000..c16d9463 --- /dev/null +++ b/src/main/java/homework_7/KittenToCatFunction.java @@ -0,0 +1,4 @@ +package homework_7; + +public interface KittenToCatFunction { +} diff --git a/src/main/java/homework_7/Main.java b/src/main/java/homework_7/Main.java new file mode 100644 index 00000000..9e900ca5 --- /dev/null +++ b/src/main/java/homework_7/Main.java @@ -0,0 +1,4 @@ +package homework_7; + +public class Main { +} From c82aee54886db36250936b3c733c4ea76af664c2 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 20 Sep 2021 01:22:37 +0300 Subject: [PATCH 42/50] Add Cat and Kitten classes Add functional interface --- src/main/java/homework_7/Cat.java | 38 +++++++++++++++++++ src/main/java/homework_7/Kitten.java | 37 ++++++++++++++++++ .../java/homework_7/KittenToCatFunction.java | 5 ++- 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/main/java/homework_7/Cat.java b/src/main/java/homework_7/Cat.java index de1dd35f..2e344cab 100644 --- a/src/main/java/homework_7/Cat.java +++ b/src/main/java/homework_7/Cat.java @@ -1,4 +1,42 @@ package homework_7; public class Cat { + + private final String breed; + private final int age; + private final int colour; + private final int weight; + + public Cat(String breed, int age, int colour, int weight) { + this.breed = breed; + this.age = age; + this.colour = colour; + this.weight = weight; + } + + public String getBreed() { + return breed; + } + + public int getAge() { + return age; + } + + public int getColour() { + return colour; + } + + public int getWeight() { + return weight; + } + + @Override + public String toString() { + return "Cat{" + + "breed='" + breed + '\'' + + ", age=" + age + + ", colour=" + colour + + ", weight=" + weight + + '}'; + } } diff --git a/src/main/java/homework_7/Kitten.java b/src/main/java/homework_7/Kitten.java index e55d5478..e16e4e5a 100644 --- a/src/main/java/homework_7/Kitten.java +++ b/src/main/java/homework_7/Kitten.java @@ -1,4 +1,41 @@ package homework_7; public class Kitten { + private final String breed; + private final int age; + private final int colour; + private final String favoriteMeal; + + public Kitten(String breed, int age, int colour, String favoriteMeal) { + this.breed = breed; + this.age = age; + this.colour = colour; + this.favoriteMeal = favoriteMeal; + } + + public String getBreed() { + return breed; + } + + public int getAge() { + return age; + } + + public int getColour() { + return colour; + } + + public String getFavoriteMeal() { + return favoriteMeal; + } + + @Override + public String toString() { + return "Kitten{" + + "breed='" + breed + '\'' + + ", age=" + age + + ", colour=" + colour + + ", favoriteMeal='" + favoriteMeal + '\'' + + '}'; + } } diff --git a/src/main/java/homework_7/KittenToCatFunction.java b/src/main/java/homework_7/KittenToCatFunction.java index c16d9463..7005f8c6 100644 --- a/src/main/java/homework_7/KittenToCatFunction.java +++ b/src/main/java/homework_7/KittenToCatFunction.java @@ -1,4 +1,7 @@ package homework_7; -public interface KittenToCatFunction { +@FunctionalInterface +public interface KittenToCatFunction { + + C grow(T object); } From d877e431e645161a77889adcd247a7066a25c6b5 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 20 Sep 2021 14:00:49 +0300 Subject: [PATCH 43/50] Add Main --- src/main/java/homework_7/Kitten.java | 6 +++--- src/main/java/homework_7/Main.java | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/homework_7/Kitten.java b/src/main/java/homework_7/Kitten.java index e16e4e5a..72da4b21 100644 --- a/src/main/java/homework_7/Kitten.java +++ b/src/main/java/homework_7/Kitten.java @@ -3,10 +3,10 @@ public class Kitten { private final String breed; private final int age; - private final int colour; + private final String colour; private final String favoriteMeal; - public Kitten(String breed, int age, int colour, String favoriteMeal) { + public Kitten(String breed, int age, String colour, String favoriteMeal) { this.breed = breed; this.age = age; this.colour = colour; @@ -21,7 +21,7 @@ public int getAge() { return age; } - public int getColour() { + public String getColour() { return colour; } diff --git a/src/main/java/homework_7/Main.java b/src/main/java/homework_7/Main.java index 9e900ca5..1c591484 100644 --- a/src/main/java/homework_7/Main.java +++ b/src/main/java/homework_7/Main.java @@ -1,4 +1,11 @@ package homework_7; public class Main { + public static void main(String[] args) { + Kitten kitten = new Kitten("bobtail", 2, "grey", "chicken"); + System.out.println(kitten); + + + } + } From 158c8f2e3bd85cde5aefc5b758e8722a5d8a3bc2 Mon Sep 17 00:00:00 2001 From: vrodina Date: Mon, 20 Sep 2021 14:47:16 +0300 Subject: [PATCH 44/50] Finish with Main class Add transformation Kitten to Cat + checking --- src/main/java/homework_7/Cat.java | 6 +++--- src/main/java/homework_7/Main.java | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/homework_7/Cat.java b/src/main/java/homework_7/Cat.java index 2e344cab..835f2fcc 100644 --- a/src/main/java/homework_7/Cat.java +++ b/src/main/java/homework_7/Cat.java @@ -4,10 +4,10 @@ public class Cat { private final String breed; private final int age; - private final int colour; + private final String colour; private final int weight; - public Cat(String breed, int age, int colour, int weight) { + public Cat(String breed, int age, String colour, int weight) { this.breed = breed; this.age = age; this.colour = colour; @@ -22,7 +22,7 @@ public int getAge() { return age; } - public int getColour() { + public String getColour() { return colour; } diff --git a/src/main/java/homework_7/Main.java b/src/main/java/homework_7/Main.java index 1c591484..12e56eed 100644 --- a/src/main/java/homework_7/Main.java +++ b/src/main/java/homework_7/Main.java @@ -1,11 +1,22 @@ package homework_7; +import java.util.Random; + public class Main { public static void main(String[] args) { Kitten kitten = new Kitten("bobtail", 2, "grey", "chicken"); System.out.println(kitten); + KittenToCatFunction transform = newKitten -> new Cat(newKitten.getBreed(), new Random().nextInt(12) + 1, newKitten.getColour(), 3); + + Cat cat = transformToCat(transform, kitten); + System.out.println(); + System.out.println(cat); + } + private static Cat transformToCat(KittenToCatFunction transformation, Kitten kitten) { + return transformation.grow(kitten); } } + From f8f2fad1f596c598272b3f6a70dfa9a195fb89aa Mon Sep 17 00:00:00 2001 From: vrodina Date: Tue, 21 Sep 2021 20:11:57 +0300 Subject: [PATCH 45/50] Update README file Add course project without tests --- README.md | 1 + src/main/java/couse_project/Color.java | 14 + src/main/java/couse_project/Displayer.java | 64 ++++ src/main/java/couse_project/Game.java | 34 ++ src/main/java/couse_project/Main.java | 17 + src/main/java/couse_project/Player.java | 72 ++++ .../couse_project/RandomIntelligence.java | 26 ++ src/main/java/couse_project/SeaMap.java | 326 ++++++++++++++++++ src/main/java/couse_project/Ship.java | 41 +++ 9 files changed, 595 insertions(+) create mode 100644 src/main/java/couse_project/Color.java create mode 100644 src/main/java/couse_project/Displayer.java create mode 100644 src/main/java/couse_project/Game.java create mode 100644 src/main/java/couse_project/Main.java create mode 100644 src/main/java/couse_project/Player.java create mode 100644 src/main/java/couse_project/RandomIntelligence.java create mode 100644 src/main/java/couse_project/SeaMap.java create mode 100644 src/main/java/couse_project/Ship.java diff --git a/README.md b/README.md index 3c26fae0..696b1c15 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ | HW_5_2 | [Custom Regex Matcher](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_5/custom_regex_matcher) | The app which read string and and check if this string matches with hardcoded regex in the app and get result: true or false | | HW_6 | [Map Problems Generator](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_6/map_problems_generator) | The app which create collisions in hashmap | | HW_7 | [Kitten To Cat Function Interface](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/homework_7/kitten_to_cat_function) | The app which create an interface for turning a kitten into a cat | +| Course project | [Sea Battle](https://github.com/NikolaevArtem/Java_Core_June_2021/tree/feature/Lera_Rodina/src/main/java/course_project) | A console Sea Battle Game (Player vs Computer version only)| [Link to Coding Bat](https://codingbat.com/done?user=lerarodina24@gmail.com&tag=9318549243) [Link to markdown giude](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) diff --git a/src/main/java/couse_project/Color.java b/src/main/java/couse_project/Color.java new file mode 100644 index 00000000..e7237452 --- /dev/null +++ b/src/main/java/couse_project/Color.java @@ -0,0 +1,14 @@ +package couse_project; + +public class Color { + + static String blue = "\033[1;34m"; + static String red = "\033[1;31m"; + static String yellow = "\033[1;33m"; + static String white = "\033[1;37m"; + static String reset = "\033[0m"; + + public static String setColor(String text, String color) { + return color + text + reset; + } +} diff --git a/src/main/java/couse_project/Displayer.java b/src/main/java/couse_project/Displayer.java new file mode 100644 index 00000000..26702593 --- /dev/null +++ b/src/main/java/couse_project/Displayer.java @@ -0,0 +1,64 @@ +package couse_project; + +import java.io.IOException; +import java.util.HashMap; + +public class Displayer { + + private final String columns = " А Б В Г Д Е Ж З И К\n"; + private final String row = "%2d %s %s %s %s %s %s %s %s %s %s\n"; + private final HashMap mapSymbols = new HashMap() {{ + put(0, " "); // пустая клетка + put(1, Color.setColor("■", Color.blue)); // корабль + put(2, Color.setColor("□", Color.yellow)); // подбитый корабль + put(3, Color.setColor("X", Color.red)); // разрушенный корабль + put(4, Color.setColor("*", Color.white)); // промах + }}; + private final HashMap radarSymbols = new HashMap() {{ + put(0, " "); // пустая клетка + put(1, " "); // корабль + put(2, Color.setColor("□", Color.yellow)); // подбитый корабль + put(3, Color.setColor("X", Color.red)); // разрушенный корабль + put(4, Color.setColor("*", Color.white)); // промах + }}; + + public void clearScreen() throws IOException, InterruptedException { + String os = System.getProperty("os.name").toLowerCase(); + if (os.contains("win")) { + new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor(); + } else if (os.contains("nix") || os.contains("nux")) { + new ProcessBuilder("terminal", "/c", "clear").inheritIO().start().waitFor(); + } + System.out.println(); + } + + public void displayMap(SeaMap map) { + StringBuilder mapImage = new StringBuilder(); + mapImage.append(columns); + for (int i = 0; i < map.size()[0]; i++) { + mapImage.append(String.format(row, i + 1, + mapSymbols.get(map.getCell(i, 0)), mapSymbols.get(map.getCell(i, 1)), + mapSymbols.get(map.getCell(i, 2)), mapSymbols.get(map.getCell(i, 3)), + mapSymbols.get(map.getCell(i, 4)), mapSymbols.get(map.getCell(i, 5)), + mapSymbols.get(map.getCell(i, 6)), mapSymbols.get(map.getCell(i, 7)), + mapSymbols.get(map.getCell(i, 8)), mapSymbols.get(map.getCell(i, 9)))); + } + mapImage.append("\n"); + System.out.print(mapImage); + } + + public void displayRadar(SeaMap radar) { + StringBuilder radarImage = new StringBuilder(); + radarImage.append(columns); + for (int i = 0; i < radar.size()[0]; i++) { + radarImage.append(String.format(row, i + 1, + radarSymbols.get(radar.getCell(i, 0)), radarSymbols.get(radar.getCell(i, 1)), + radarSymbols.get(radar.getCell(i, 2)), radarSymbols.get(radar.getCell(i, 3)), + radarSymbols.get(radar.getCell(i, 4)), radarSymbols.get(radar.getCell(i, 5)), + radarSymbols.get(radar.getCell(i, 6)), radarSymbols.get(radar.getCell(i, 7)), + radarSymbols.get(radar.getCell(i, 8)), radarSymbols.get(radar.getCell(i, 9)))); + } + radarImage.append("\n"); + System.out.print(radarImage); + } +} diff --git a/src/main/java/couse_project/Game.java b/src/main/java/couse_project/Game.java new file mode 100644 index 00000000..0d1bcd83 --- /dev/null +++ b/src/main/java/couse_project/Game.java @@ -0,0 +1,34 @@ +package couse_project; + +import java.io.IOException; + +public class Game { + Player playerOne; + RandomIntelligence playerTwo; + + public Game(Player playerOne, RandomIntelligence playerTwo) { + this.playerOne = playerOne; + this.playerTwo = playerTwo; + } + + public void startGame() throws IOException, InterruptedException { + Displayer displayer = new Displayer(); + while (true) { + displayer.clearScreen(); + displayer.displayMap(playerOne.getMap()); + displayer.displayRadar(playerOne.getRadar()); + if (playerOne.shoot()) { + System.out.println("Отлично! Сделайте еще один ход:"); + continue; + } + + while (true) { + if (playerTwo.shoot()) { + System.out.println("Наш корабль попал под обстрел!"); + } else { + break; + } + } + } + } +} diff --git a/src/main/java/couse_project/Main.java b/src/main/java/couse_project/Main.java new file mode 100644 index 00000000..bf284b65 --- /dev/null +++ b/src/main/java/couse_project/Main.java @@ -0,0 +1,17 @@ +package couse_project; + +import java.io.IOException; + +public class Main { + + public static void main(String[] args) throws IOException, InterruptedException { + SeaMap mapOne = new SeaMap(); + SeaMap mapTwo = new SeaMap(); + + Player playerOne = new Player("Lera", mapOne, mapTwo); + RandomIntelligence playerTwo = new RandomIntelligence(mapTwo, mapOne); + + Game gameSession = new Game(playerOne, playerTwo); + gameSession.startGame(); + } +} diff --git a/src/main/java/couse_project/Player.java b/src/main/java/couse_project/Player.java new file mode 100644 index 00000000..8be8fb64 --- /dev/null +++ b/src/main/java/couse_project/Player.java @@ -0,0 +1,72 @@ +package couse_project; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Scanner; + +public class Player { + final private String name; + private final SeaMap map; + private final SeaMap radar; + final private String[] commands = new String[]{ + "А1", "А2", "А3", "А4", "А5", "А6", "А7", "А8", "А9", "А10", + "Б1", "Б2", "Б3", "Б4", "Б5", "Б6", "Б7", "Б8", "Б9", "Б10", + "В1", "В2", "В3", "В4", "В5", "В6", "В7", "В8", "В9", "В10", + "Г1", "Г2", "Г3", "Г4", "Г5", "Г6", "Г7", "Г8", "Г9", "Г10", + "Д1", "Д2", "Д3", "Д4", "Д5", "Д6", "Д7", "Д8", "Д9", "Д10", + "Е1", "Е2", "Е3", "Е4", "Е5", "Е6", "Е7", "Е8", "Е9", "Е10", + "Ж1", "Ж2", "Ж3", "Ж4", "Ж5", "Ж6", "Ж7", "Ж8", "Ж9", "Ж10", + "З1", "З2", "З3", "З4", "З5", "З6", "З7", "З8", "З9", "З10", + "И1", "И2", "И3", "И4", "И5", "И6", "И7", "И8", "И9", "И10", + "К1", "К2", "К3", "К4", "К5", "К6", "К7", "К8", "К9", "К10", + }; + final private HashMap commandsMap = new HashMap() {{ + put("А", 0); + put("Б", 1); + put("В", 2); + put("Г", 3); + put("Д", 4); + put("Е", 5); + put("Ж", 6); + put("З", 7); + put("И", 8); + put("К", 9); + }}; + + public Player(String name, SeaMap map, SeaMap radar) { + this.name = name; + this.map = map; + this.radar = radar; + } + + public boolean shoot() { + Scanner in = new Scanner(System.in); + System.out.println("Ваш ход:"); + String command = in.nextLine(); + + if (Arrays.asList(commands).contains(command)) { + System.out.println(command.toUpperCase().charAt(0)); + + int x = commandsMap.get((Character.toString(command.toUpperCase().charAt(0)))); + int y = Integer.parseInt(Character.toString(command.charAt(1))) - 1; + + if (radar.isFreeEnterCell(x, y)) { + return radar.registerShot(x, y); + } + } else { + System.out.println("Ошибка формата данных"); + System.out.println("Попробуйте, пожалуйста, ещё раз"); + } + + shoot(); + return false; + } + + public SeaMap getMap() { + return map; + } + + public SeaMap getRadar() { + return radar; + } +} \ No newline at end of file diff --git a/src/main/java/couse_project/RandomIntelligence.java b/src/main/java/couse_project/RandomIntelligence.java new file mode 100644 index 00000000..95e5a963 --- /dev/null +++ b/src/main/java/couse_project/RandomIntelligence.java @@ -0,0 +1,26 @@ +package couse_project; + +import java.util.Random; + +public class RandomIntelligence { + private SeaMap map; + private final SeaMap radar; + + public RandomIntelligence(SeaMap map, SeaMap radar) { + this.map = map; + this.radar = radar; + } + + public boolean shoot() { + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + + if (radar.isFreeEnterCell(x, y)) { + return radar.registerShot(x, y); + } + + shoot(); + return false; + } +} diff --git a/src/main/java/couse_project/SeaMap.java b/src/main/java/couse_project/SeaMap.java new file mode 100644 index 00000000..2806decd --- /dev/null +++ b/src/main/java/couse_project/SeaMap.java @@ -0,0 +1,326 @@ +package couse_project; + +public class SeaMap implements Cloneable { + private final int[][] field = new int[10][10]; + + public SeaMap() { + randomShipsFill(); + } + + public SeaMap clone() throws CloneNotSupportedException { + return (SeaMap) super.clone(); + } + + public int[][] getField() { + return field; + } + + public int[] size() { + return new int[]{10, 10}; + } + + public int getCell(int row, int col) { + return field[row][col]; + } + + public boolean cellIsEmpty(int x, int y) { + return field[y][x] == 0; + } + + public boolean isHealthyShip(int x, int y) { + return field[y][x] == 1; + } + + public boolean isWreckedShip(int x, int y) { + return field[y][x] == 2; + } + + public boolean isFreeEnterCell(int x, int y) { + return field[y][x] == 0 || field[y][x] == 1; + } + + public void randomShipsFill() { + java.util.Random random = new java.util.Random(); + int[] shipsSizes = new int[]{4, 3, 3, 2, 2, 2, 1, 1, 1, 1}; + + for (int size : shipsSizes) { + int x = random.nextInt(10); + int y = random.nextInt(10); + int rotate = random.nextInt(2); + Ship ship = new Ship(size, x, y, rotate == 1); + while (!canSetShip(ship)) { + x = random.nextInt(10); + y = random.nextInt(10); + rotate = random.nextInt(2); + ship = new Ship(size, x, y, rotate == 1); + } + + for (int i = 0; i < size; i++) { + if (ship.isRotate()) { + field[y + i][x] = 1; + } else { + field[y][x + i] = 1; + } + } + } + } + + private boolean canSetShip(Ship ship) { + if (ship.getX() < 0 || ship.getY() < 0 || field.length <= ship.getX() || field.length <= ship.getY()) { + return false; + } + if (ship.isRotate() && field.length <= ship.getY() + ship.getSize()) { + return false; + } + if (!ship.isRotate() && field.length <= ship.getX() + ship.getSize()) { + return false; + } + + int minX = Math.max(0, ship.getX() - 1); + int minY = Math.max(0, ship.getY() - 1); + int maxX = Math.min(field.length - 1, ship.getX() + 1 + (ship.isRotate() ? 0 : ship.getSize())); + int maxY = Math.min(field.length - 1, ship.getY() + 1 + (ship.isRotate() ? ship.getSize() : 0)); + + for (int x = minX; x <= maxX; x++) { + for (int y = minY; y <= maxY; y++) { + if (!cellIsEmpty(x, y)) { + return false; + } + } + } + return true; + } + + public boolean registerShot(int x, int y) { + if (cellIsEmpty(x, y)) { + field[y][x] = 4; + return false; + } else if (isHealthyShip(x, y)) { + field[y][x] = 2; + if (!shipIsAlive(x, y)) { + markDestroyedShip(x, y); + } + return true; + } + return false; + } + + private boolean shipIsAlive(int x, int y) { + int[] env = new int[]{-1, -1, -1, -1}; + if (x != 0) { + env[0] = x - 1; + } + if (x != 9) { + env[1] = x + 1; + } + if (y != 0) { + env[2] = y - 1; + } + if (y != 9) { + env[3] = y + 1; + } + + if (isVerticalShip(x, y)) { + for (int i = 2; i < env.length; i++) { + if (env[i] != -1) { + if (field[env[i]][x] == 1) { + return true; + } else if (field[env[i]][x] == 2) { + int positionY = y; + + while (positionY > 0 && (field[positionY][x] != 0 && field[positionY][x] != 4)) { + if (field[positionY][x] == 1) { + return true; + } + positionY -= 1; + } + + while (positionY < 9 && (field[positionY][x] != 0 && field[positionY][x] != 4)) { + if (field[positionY][x] == 1) { + return true; + } + positionY += 1; + } + + if (field[positionY][x] == 1) { + return true; + } + } + } + } + } else { + for (int i = 0; i < env.length / 2; i++) { + if (env[i] != -1) { + if (field[y][env[i]] == 1) { + return true; + } else if (field[y][env[i]] == 2) { + int positionX = x; + + while (positionX > 0 && (field[y][positionX] != 0 && field[y][positionX] != 4)) { + if (field[y][positionX] == 1) { + return true; + } + positionX -= 1; + } + + while (positionX < 9 && (field[y][positionX] != 0 && field[y][positionX] != 4)) { + if (field[y][positionX] == 1) { + return true; + } + positionX += 1; + } + + if (field[y][positionX] == 1) { + return true; + } + } + } + } + } + return false; + } + + private void markDestroyedShip(int x, int y) { + if (isVerticalShip(x, y)) { + int positionY = y; + while (positionY > 0 && (field[positionY][x] != 0 && field[positionY][x] != 4)) { + positionY -= 1; + } + if (field[positionY][x] != 1 && field[positionY][x] != 2) { + positionY += 1; + } + + while (positionY < 9 && (field[positionY][x] != 0 && field[positionY][x] != 4)) { + field[positionY][x] = 3; + + if (positionY > 0) { + if (field[positionY - 1][x] == 0) { + field[positionY - 1][x] = 4; + } + if (x + 1 <= 9) { + if (field[positionY - 1][x + 1] == 0) { + field[positionY - 1][x + 1] = 4; + } + } + if (x - 1 >= 0) { + if (field[positionY - 1][x - 1] == 0) { + field[positionY - 1][x - 1] = 4; + } + } + } + + if (x > 0) { + if (field[positionY][x - 1] == 0) { + field[positionY][x - 1] = 4; + } + } + + if (x < 9) { + if (field[positionY][x + 1] == 0) { + field[positionY][x + 1] = 4; + } + } + + if (field[positionY + 1][x] == 0) { + field[positionY + 1][x] = 4; + } + + if (x + 1 <= 9) { + if (field[positionY + 1][x + 1] == 0) { + field[positionY + 1][x + 1] = 4; + } + } + + if (x - 1 >= 0) { + if (field[positionY + 1][x - 1] == 0) { + field[positionY + 1][x - 1] = 4; + } + } + + positionY += 1; + } + } else { + int positionX = x; + while (positionX > 0 && (field[y][positionX] != 0 && field[y][positionX] != 4)) { + positionX -= 1; + } + if (field[y][positionX] != 1 && field[y][positionX] != 2) { + positionX += 1; + } + + while (positionX < 9 && (field[y][positionX] != 0 && field[y][positionX] != 4)) { + field[y][positionX] = 3; + + if (positionX > 0) { + if (field[y][positionX - 1] == 0) { + field[y][positionX - 1] = 4; + } + if (y + 1 <= 9) { + if (field[y + 1][positionX - 1] == 0) { + field[y + 1][positionX - 1] = 4; + } + } + if (y - 1 >= 0) { + if (field[y - 1][positionX - 1] == 0) { + field[y - 1][positionX - 1] = 4; + } + } + } + + if (y > 0) { + if (field[y - 1][positionX] == 0) { + field[y - 1][positionX] = 4; + } + } + + if (y < 9) { + if (field[y + 1][positionX] == 0) { + field[y + 1][positionX] = 4; + } + } + + if (field[y][positionX + 1] == 0) { + field[y][positionX + 1] = 4; + } + if (y + 1 <= 9) { + if (field[y + 1][positionX + 1] == 0) { + field[y + 1][positionX + 1] = 4; + } + } + if (y - 1 >= 0) { + if (field[y - 1][positionX + 1] == 0) { + field[y - 1][positionX + 1] = 4; + } + } + + positionX += 1; + } + } + } + + private boolean isVerticalShip(int x, int y) { + int[] env = new int[]{-1, -1, -1, -1}; + if (x != 0) { + env[0] = x - 1; + } + if (x != 9) { + env[1] = x + 1; + } + if (y != 0) { + env[2] = y - 1; + } + if (y != 9) { + env[3] = y + 1; + } + + for (int i = 0; i < env.length / 2; i++) { + if (env[i] != -1) { + if (field[y][env[i]] == 1 || field[y][env[i]] == 2) { + return false; + } + } + } + return true; + } + +} diff --git a/src/main/java/couse_project/Ship.java b/src/main/java/couse_project/Ship.java new file mode 100644 index 00000000..c339f715 --- /dev/null +++ b/src/main/java/couse_project/Ship.java @@ -0,0 +1,41 @@ +package couse_project; + +public class Ship { + private final int size; + private final int x; + private final int y; + private final boolean rotate; + + public Ship(int size, int x, int y, boolean rotate) { + this.size = size; + this.x = x; + this.y = y; + this.rotate = rotate; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getSize() { + return size; + } + + public boolean isRotate() { + return rotate; + } + + @Override + public String toString() { + return "Ship{" + + "size=" + size + + ", x=" + x + + ", y=" + y + + ", rotate=" + rotate + + '}'; + } +} \ No newline at end of file From 4e9dece6102b94ed3f7e3775312a58d4eaf42445 Mon Sep 17 00:00:00 2001 From: vrodina Date: Tue, 21 Sep 2021 20:25:25 +0300 Subject: [PATCH 46/50] Add About for course project --- src/main/java/couse_project/About | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/couse_project/About diff --git a/src/main/java/couse_project/About b/src/main/java/couse_project/About new file mode 100644 index 00000000..2b2de22f --- /dev/null +++ b/src/main/java/couse_project/About @@ -0,0 +1,30 @@ + +Course project SEA BATTLE + +--------------------------------------- + +Here you can try to play Sea Battle game! + + +I developed a version of a game "Player vs Computer" + +Just to make a game a bit faster - all ships automatically are created randomly before starting this game. +And you might not spend time for creating it by yourself. + +There are: + 4-deck ships - 1 + 3-deck ships - 2 + 2-deck ships - 3 + 1-deck ships - 4 + + (Just because I ve remembered these rules since my childhood:)) + + After starting a game you see your seaMap (with blue color) and you should make your first move! + + If your/computer's ship is found, cell will have a yellow color. + If a ship is destroyed fully, a color is red. + If you/computer makes a mistake - you wil see just a white "star". + + I decided to make a console interface of game in Russian as our traditional game:) + + Hope this game will be convenient for you! From 4166be0ca2ebc7c488e48a7c30880f461ab574b5 Mon Sep 17 00:00:00 2001 From: RODINA LERA Date: Tue, 21 Sep 2021 23:41:39 +0300 Subject: [PATCH 47/50] Update src/main/java/homework_7/Main.java Co-authored-by: Artem Nikolaev --- src/main/java/homework_7/Main.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/homework_7/Main.java b/src/main/java/homework_7/Main.java index 12e56eed..4ed83715 100644 --- a/src/main/java/homework_7/Main.java +++ b/src/main/java/homework_7/Main.java @@ -9,14 +9,10 @@ public static void main(String[] args) { KittenToCatFunction transform = newKitten -> new Cat(newKitten.getBreed(), new Random().nextInt(12) + 1, newKitten.getColour(), 3); - Cat cat = transformToCat(transform, kitten); + Cat cat = transform.grow(kitten); System.out.println(); System.out.println(cat); } - private static Cat transformToCat(KittenToCatFunction transformation, Kitten kitten) { - return transformation.grow(kitten); - } - } From b49043a3821ec9d4d9a1d47a6e02edfad517c2ec Mon Sep 17 00:00:00 2001 From: vrodina Date: Thu, 23 Sep 2021 01:15:12 +0300 Subject: [PATCH 48/50] Fix HW3 --- src/main/java/homework_3/ImmutableClass.java | 78 ++++++++++++-------- 1 file changed, 47 insertions(+), 31 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index aff0cbfc..4e0a2bcb 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -1,34 +1,34 @@ package homework_3; /** -A Strategy for Defining Immutable Objects (from the official Oracle documentation) - -1. Don't provide "setter" methods — methods that modify fields or objects referred to by fields. - -2. Make all fields final and private. - -3. Don't allow subclasses to override methods. The simplest way to do this is to declare the class as final. -A more sophisticated approach is to make the constructor private and construct instances in factory methods. - -4. If the instance fields include references to mutable objects, don't allow those objects to be changed: - - Don't provide methods that modify the mutable objects. - - Don't share references to the mutable objects. - Never store references to external, mutable objects passed to the constructor; - if necessary, create copies, and store references to the copies. - Similarly, create copies of your internal mutable objects when necessary to avoid returning the originals in your methods. + * A Strategy for Defining Immutable Objects (from the official Oracle documentation) + *

+ * 1. Don't provide "setter" methods — methods that modify fields or objects referred to by fields. + *

+ * 2. Make all fields final and private. + *

+ * 3. Don't allow subclasses to override methods. The simplest way to do this is to declare the class as final. + * A more sophisticated approach is to make the constructor private and construct instances in factory methods. + *

+ * 4. If the instance fields include references to mutable objects, don't allow those objects to be changed: + * - Don't provide methods that modify the mutable objects. + * - Don't share references to the mutable objects. + * Never store references to external, mutable objects passed to the constructor; + * if necessary, create copies, and store references to the copies. + * Similarly, create copies of your internal mutable objects when necessary to avoid returning the originals in your methods. */ final public class ImmutableClass { // Values must be between 0 and 255 (RGB) - final private int red; - final private int green; - final private int blue; + final private Integer red; + final private Integer green; + final private Integer blue; final private String name; - private void check(int red, - int green, - int blue) { + private void check(Integer red, + Integer green, + Integer blue) { if (red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255) { @@ -36,15 +36,15 @@ private void check(int red, } } - public ImmutableClass(int red, - int green, - int blue, + public ImmutableClass(Integer red, + Integer green, + Integer blue, String name) { check(red, green, blue); - this.red = red; - this.green = green; - this.blue = blue; - this.name = name; + this.red = new Integer(red); + this.green = new Integer(green); + this.blue = new Integer(blue); + this.name = new String(name); } public ImmutableClass() { @@ -54,13 +54,20 @@ public ImmutableClass() { this.name = "black"; } + public Integer getRed() { + return new Integer(red); + } + + public Integer getGreen() { + return new Integer(green); + } - public int getRGB() { - return ((red << 16) | (green << 8) | blue); + public Integer getBlue() { + return new Integer(blue); } public String getName() { - return name; + return new String(name); } public ImmutableClass invert() { @@ -70,4 +77,13 @@ public ImmutableClass invert() { 255 - blue, "Inverse of " + name); } + + public ImmutableClass getInstance() { + return new ImmutableClass( + getRed(), + getGreen(), + getBlue(), + getName() + ); + } } From e548bdf5d1b719e706d2b8f0fa80e1e7a59a5198 Mon Sep 17 00:00:00 2001 From: vrodina Date: Thu, 23 Sep 2021 01:45:38 +0300 Subject: [PATCH 49/50] Fix HW3 --- src/main/java/homework_3/ImmutableClass.java | 62 +++++++------------- 1 file changed, 20 insertions(+), 42 deletions(-) diff --git a/src/main/java/homework_3/ImmutableClass.java b/src/main/java/homework_3/ImmutableClass.java index 4e0a2bcb..7cb2ed3b 100644 --- a/src/main/java/homework_3/ImmutableClass.java +++ b/src/main/java/homework_3/ImmutableClass.java @@ -1,5 +1,8 @@ package homework_3; +import java.util.ArrayList; +import java.util.Arrays; + /** * A Strategy for Defining Immutable Objects (from the official Oracle documentation) *

@@ -21,10 +24,8 @@ final public class ImmutableClass { // Values must be between 0 and 255 (RGB) - final private Integer red; - final private Integer green; - final private Integer blue; - final private String name; + final private ArrayList dataColor; + final private StringBuilder name; private void check(Integer red, Integer green, @@ -36,54 +37,31 @@ private void check(Integer red, } } - public ImmutableClass(Integer red, - Integer green, - Integer blue, - String name) { - check(red, green, blue); - this.red = new Integer(red); - this.green = new Integer(green); - this.blue = new Integer(blue); - this.name = new String(name); - } - - public ImmutableClass() { - this.red = 0; - this.green = 0; - this.blue = 0; - this.name = "black"; + public ImmutableClass(ArrayList dataColor, + StringBuilder name) { + check(dataColor.get(0), dataColor.get(1), dataColor.get(2)); + this.dataColor = new ArrayList<>(dataColor); + this.name = new StringBuilder(name); } - public Integer getRed() { - return new Integer(red); - } - - public Integer getGreen() { - return new Integer(green); - } - public Integer getBlue() { - return new Integer(blue); + public ArrayList getColorData() + { + return new ArrayList<>(dataColor); } - public String getName() { - return new String(name); + public StringBuilder getName() { + return new StringBuilder(name); } public ImmutableClass invert() { - return new ImmutableClass( - 255 - red, - 255 - green, - 255 - blue, - "Inverse of " + name); + return new ImmutableClass(new ArrayList<>(Arrays.asList(255 - dataColor.get(0), + 255 - dataColor.get(1), + 255 - dataColor.get(2)) + ), new StringBuilder("Inverse of " + name)); } public ImmutableClass getInstance() { - return new ImmutableClass( - getRed(), - getGreen(), - getBlue(), - getName() - ); + return new ImmutableClass(getColorData(), getName()); } } From 4551b57015ac62bf7ea568b0149f4d878854a522 Mon Sep 17 00:00:00 2001 From: vrodina Date: Thu, 23 Sep 2021 03:07:24 +0300 Subject: [PATCH 50/50] Fix HW6 --- .../map_problems_generator/Main.java | 35 ++++++++++++++----- .../MapProblemsCollisionGenerator.java | 35 ++++++++----------- .../MapProblemsMutableGenerator.java | 24 ++++++------- 3 files changed, 52 insertions(+), 42 deletions(-) diff --git a/src/main/java/homework_6/map_problems_generator/Main.java b/src/main/java/homework_6/map_problems_generator/Main.java index 39a95b25..5f02649f 100644 --- a/src/main/java/homework_6/map_problems_generator/Main.java +++ b/src/main/java/homework_6/map_problems_generator/Main.java @@ -4,19 +4,38 @@ public class Main { public static void main(String[] args) { - HashMap, String> container_problems_coll_gen = new HashMap<>(); - container_problems_coll_gen.put(new MapProblemsCollisionGenerator<>("one", "one"), "one"); - container_problems_coll_gen.put(new MapProblemsCollisionGenerator<>("two", "two"), "two"); + HashMap container_mutable_gen = new HashMap<>(); - String resultTwo_1 = container_problems_coll_gen.get(new MapProblemsCollisionGenerator<>("two", "two")); + MapProblemsMutableGenerator generator_one = new MapProblemsMutableGenerator(new StringBuilder("one")); + MapProblemsMutableGenerator generator_two = new MapProblemsMutableGenerator(new StringBuilder("two")); + container_mutable_gen.put(generator_one, "one"); + container_mutable_gen.put(generator_two, "two"); + String resultTwo_valid = container_mutable_gen.get(generator_two); + System.out.println("resultTwo_valid = " + resultTwo_valid); - HashMap, String> container_mutable_gen = new HashMap<>(); - container_mutable_gen.put(new MapProblemsMutableGenerator<>("one"), "one"); - container_mutable_gen.put(new MapProblemsMutableGenerator<>("two"), "two"); + generator_two.setKey(new StringBuilder("collision")); - String resultTwo_2 = container_mutable_gen.get(new MapProblemsMutableGenerator<>("two")); + String resultTwo_invalid = container_mutable_gen.get(generator_two); + + System.out.println("resultTwo_invalid = " + resultTwo_invalid); + + + HashMap container_problems_coll_gen = new HashMap<>(); + + MapProblemsCollisionGenerator one_collision_gen = new MapProblemsCollisionGenerator(new StringBuilder("one")); + MapProblemsCollisionGenerator two_collision_gen = new MapProblemsCollisionGenerator(new StringBuilder("two")); + MapProblemsCollisionGenerator three_collision_gen = new MapProblemsCollisionGenerator(new StringBuilder("three")); + + + container_problems_coll_gen.put(one_collision_gen, "one"); + container_problems_coll_gen.put(two_collision_gen, "two"); + container_problems_coll_gen.put(three_collision_gen, "three"); + + System.out.println("Count of collision in one_collision_gen = " + one_collision_gen.getCountCollision()); + System.out.println("Count of collision in two_collision_gen = " + two_collision_gen.getCountCollision()); + System.out.println("Count of collision in three_collision_gen = " + three_collision_gen.getCountCollision()); } } diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java index 867f93f4..83f57393 100644 --- a/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsCollisionGenerator.java @@ -1,41 +1,36 @@ package homework_6.map_problems_generator; -public class MapProblemsCollisionGenerator{ - private F1 f1; - private F2 f2; +import java.util.Objects; - public MapProblemsCollisionGenerator(F1 f1, F2 f2) { - this.f1 = f1; - this.f2 = f2; - } +public class MapProblemsCollisionGenerator { - public F1 getF1() { - return f1; - } + private Integer countCollision = 0; + private StringBuilder key; - public F2 getF2() { - return f2; + public MapProblemsCollisionGenerator(StringBuilder key) { + this.key = key; } - public void setF1(F1 f1) { - this.f1 = f1; + public void setKey(StringBuilder key) { + this.key = key; } - public void setF2(F2 f2) { - this.f2 = f2; + public Integer getCountCollision() + { + return countCollision; } @Override public boolean equals(Object o) { + countCollision++; if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MapProblemsCollisionGenerator that = (MapProblemsCollisionGenerator) o; - return f1.equals(that.f1) && - f2.equals(that.f2); + MapProblemsCollisionGenerator that = (MapProblemsCollisionGenerator) o; + return key.equals(that.key); } @Override - public final int hashCode() { + public int hashCode() { return 1; } } diff --git a/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java index 614c2eb9..8fb40113 100644 --- a/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java +++ b/src/main/java/homework_6/map_problems_generator/MapProblemsMutableGenerator.java @@ -2,31 +2,27 @@ import java.util.Objects; -public class MapProblemsMutableGenerator { - private F1 f1; +public class MapProblemsMutableGenerator{ + private StringBuilder key; - public MapProblemsMutableGenerator(F1 f1) { - this.f1 = f1; + public MapProblemsMutableGenerator(StringBuilder key) { + this.key = key; } - public F1 getF1() { - return f1; - } - - public void setF1(F1 f1) { - this.f1 = f1; + public void setKey(StringBuilder key) { + this.key = key; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - MapProblemsMutableGenerator that = (MapProblemsMutableGenerator) o; - return f1.equals(that.f1); + MapProblemsMutableGenerator that = (MapProblemsMutableGenerator) o; + return key.equals(that.key); } @Override - public final int hashCode() { - return Objects.hashCode(f1); + public int hashCode() { + return Objects.hash(key); } }