From 89b900719b981b2185352613d20afba7184db6e6 Mon Sep 17 00:00:00 2001 From: oleksii Date: Wed, 12 Dec 2018 23:55:48 +0200 Subject: [PATCH 1/5] Part three implementation --- .idea/misc.xml | 2 +- src/flashcards/Main.java | 31 +++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index a165cb3..dc565b0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/src/flashcards/Main.java b/src/flashcards/Main.java index d1b036c..d043d34 100644 --- a/src/flashcards/Main.java +++ b/src/flashcards/Main.java @@ -1,7 +1,34 @@ package flashcards; +import java.util.Scanner; + public class Main { - public static void main(String[] args) { - System.out.print("Hello world!"); + + public static void main(String[] args) { + try (Scanner scanner = new Scanner(System.in)) { + System.out.printf("Input the number of cards:\n"); + + int numCards = Integer.parseInt(scanner.nextLine()); + + String[] cards = new String[numCards]; + String[] definitions = new String[numCards]; + + for (int i = 0; i < numCards; i++) { + System.out.printf("The card #%d:\n", i + 1); + cards[i] = scanner.nextLine(); + System.out.printf("The definition of the card #%d:\n", i + 1); + definitions[i] = scanner.nextLine(); + } + + for (int i = 0; i < numCards; i++) { + System.out.printf("Print the definition of \"%s\":\n", cards[i]); + String guess = scanner.nextLine(); + if (definitions[i].equals(guess)) { + System.out.printf("Correct answer. "); + } else { + System.out.printf("Wrong answer (the correct one is \"%s\").", definitions[i]); + } + } } + } } \ No newline at end of file From afdf8712ba1456134a4c6efd3f399a49937c4a25 Mon Sep 17 00:00:00 2001 From: oleksii Date: Thu, 13 Dec 2018 00:45:28 +0200 Subject: [PATCH 2/5] Part four implementation --- src/flashcards/Main.java | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/flashcards/Main.java b/src/flashcards/Main.java index d043d34..4baae13 100644 --- a/src/flashcards/Main.java +++ b/src/flashcards/Main.java @@ -1,5 +1,8 @@ package flashcards; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Scanner; public class Main { @@ -10,23 +13,30 @@ public static void main(String[] args) { int numCards = Integer.parseInt(scanner.nextLine()); - String[] cards = new String[numCards]; - String[] definitions = new String[numCards]; + Map cardToDefinition = new LinkedHashMap<>(); + Map definitionToCard = new LinkedHashMap<>(); for (int i = 0; i < numCards; i++) { System.out.printf("The card #%d:\n", i + 1); - cards[i] = scanner.nextLine(); + String card = scanner.nextLine(); System.out.printf("The definition of the card #%d:\n", i + 1); - definitions[i] = scanner.nextLine(); + String definition = scanner.nextLine(); + cardToDefinition.put(card, definition); + definitionToCard.put(definition, card); } - for (int i = 0; i < numCards; i++) { - System.out.printf("Print the definition of \"%s\":\n", cards[i]); + for (String card : cardToDefinition.keySet()) { + System.out.printf("Print the definition of \"%s\":\n", card); String guess = scanner.nextLine(); - if (definitions[i].equals(guess)) { + if (definitionToCard.containsKey(guess) && cardToDefinition.get(card).equals(guess)) { System.out.printf("Correct answer. "); + } else if (definitionToCard.containsKey(guess)) { + System.out.printf( + "Wrong answer (the correct one is \"%s\", you've just written a definition of \"%s\" card). ", + cardToDefinition.get(card), definitionToCard.get(guess)); } else { - System.out.printf("Wrong answer (the correct one is \"%s\").", definitions[i]); + System.out + .printf("Wrong answer (the correct one is \"%s\").", cardToDefinition.get(card)); } } } From 12bfba94eaab2e81dd797182acf6ff41ec3812fc Mon Sep 17 00:00:00 2001 From: oleksii Date: Thu, 13 Dec 2018 23:57:55 +0200 Subject: [PATCH 3/5] part five implemented --- src/flashcards/Main.java | 137 ++++++++++++++++++++++++++++++++------- 1 file changed, 113 insertions(+), 24 deletions(-) diff --git a/src/flashcards/Main.java b/src/flashcards/Main.java index 4baae13..8385f75 100644 --- a/src/flashcards/Main.java +++ b/src/flashcards/Main.java @@ -1,44 +1,133 @@ package flashcards; -import java.util.HashMap; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Map.Entry; import java.util.Scanner; public class Main { + private static Map cardToDefinition = new LinkedHashMap<>(); + private static Map definitionToCard = new LinkedHashMap<>(); + public static void main(String[] args) { try (Scanner scanner = new Scanner(System.in)) { - System.out.printf("Input the number of cards:\n"); + while (true) { + System.out.println("Input the action (add, remove, import, export, ask, exit):"); - int numCards = Integer.parseInt(scanner.nextLine()); + String action = scanner.nextLine(); - Map cardToDefinition = new LinkedHashMap<>(); - Map definitionToCard = new LinkedHashMap<>(); + switch (action) { + case "add": + addCard(scanner); + break; + case "remove": + removeCard(scanner); + break; + case "import": + importCard(scanner); + break; + case "export": + exportCard(scanner); + break; + case "ask": + askCard(scanner); + break; + case "exit": + System.out.println("Bye bye!"); + return; + } + } + } + } - for (int i = 0; i < numCards; i++) { - System.out.printf("The card #%d:\n", i + 1); - String card = scanner.nextLine(); - System.out.printf("The definition of the card #%d:\n", i + 1); - String definition = scanner.nextLine(); - cardToDefinition.put(card, definition); - definitionToCard.put(definition, card); + private static void askCard(Scanner scanner) { + System.out.println("How many times to ask?"); + int n = Integer.parseInt(scanner.nextLine()); + for (String card : cardToDefinition.keySet()) { + if (n <= 0) { + break; } + System.out.printf("Print the definition of \"%s\":\n", card); + String guess = scanner.nextLine(); + if (definitionToCard.containsKey(guess) && cardToDefinition.get(card).equals(guess)) { + System.out.printf("Correct answer.\n"); + } else if (definitionToCard.containsKey(guess)) { + System.out.printf( + "Wrong answer (the correct one is \"%s\", you've just written a definition of \"%s\" card).\n", + cardToDefinition.get(card), definitionToCard.get(guess)); + } else { + System.out + .printf("Wrong answer (the correct one is \"%s\").\n", cardToDefinition.get(card)); + } + n--; + } + System.out.printf("\n"); + } - for (String card : cardToDefinition.keySet()) { - System.out.printf("Print the definition of \"%s\":\n", card); - String guess = scanner.nextLine(); - if (definitionToCard.containsKey(guess) && cardToDefinition.get(card).equals(guess)) { - System.out.printf("Correct answer. "); - } else if (definitionToCard.containsKey(guess)) { - System.out.printf( - "Wrong answer (the correct one is \"%s\", you've just written a definition of \"%s\" card). ", - cardToDefinition.get(card), definitionToCard.get(guess)); - } else { - System.out - .printf("Wrong answer (the correct one is \"%s\").", cardToDefinition.get(card)); + private static void exportCard(Scanner scanner) { + System.out.println("File name:"); + String fileName = scanner.nextLine(); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName)); + PrintWriter print = new PrintWriter(writer)) { + for (Entry entry : cardToDefinition.entrySet()) { + print.printf("%s\n%s\n", entry.getKey(), entry.getValue()); + } + } catch (IOException e) { + System.out.printf("0 cards have been saved.\n\n"); + return; + } + System.out.printf("%d cards have been saved.\n\n", cardToDefinition.size()); + } + + private static void importCard(Scanner scanner) { + System.out.println("File name:"); + String fileName = scanner.nextLine(); + int count = 0; + try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) { + String card; + while ((card = reader.readLine()) != null) { + String def = reader.readLine(); + if (def == null) { + break; } + cardToDefinition.put(card, def); + definitionToCard.put(def, card); + count++; } + } catch (IOException e) { + System.out.printf("0 cards have been saved.\n\n"); + return; + } + System.out.printf("%d cards have been saved.\n\n", count); + } + + private static void removeCard(Scanner scanner) { + System.out.println("The card:"); + String card = scanner.nextLine(); + if (cardToDefinition.containsKey(card)) { + String def = cardToDefinition.get(card); + definitionToCard.remove(def); + cardToDefinition.remove(card); + System.out.println("The card successfully removed\n\n"); + } else { + System.out.printf("Can't remove \"%s\": there is no such card.\n\n", card); } } + + private static void addCard(Scanner scanner) { + System.out.println("The card:"); + String card = scanner.nextLine(); + System.out.println("The definition of the card:"); + String definition = scanner.nextLine(); + cardToDefinition.put(card, definition); + definitionToCard.put(definition, card); + System.out.printf("The pair (\"%s\":\"%s\") is added.\n\n", card, definition); + } } \ No newline at end of file From 386cd44fb211ab74ba9d9d5eda4313f63f27d8ca Mon Sep 17 00:00:00 2001 From: oleksii Date: Fri, 14 Dec 2018 00:55:46 +0200 Subject: [PATCH 4/5] part six implemented --- src/flashcards/Main.java | 71 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/src/flashcards/Main.java b/src/flashcards/Main.java index 8385f75..eb8e178 100644 --- a/src/flashcards/Main.java +++ b/src/flashcards/Main.java @@ -6,7 +6,11 @@ import java.io.PrintWriter; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Scanner; @@ -15,14 +19,19 @@ public class Main { private static Map cardToDefinition = new LinkedHashMap<>(); private static Map definitionToCard = new LinkedHashMap<>(); + private static List logs = new ArrayList<>(); + private static Map stats = new HashMap<>(); public static void main(String[] args) { try (Scanner scanner = new Scanner(System.in)) { while (true) { - System.out.println("Input the action (add, remove, import, export, ask, exit):"); + System.out.println( + "Input the action (add, remove, import, export, ask, exit, log, hardest card, reset stats):"); String action = scanner.nextLine(); + logs.add(action); + switch (action) { case "add": addCard(scanner); @@ -42,29 +51,82 @@ public static void main(String[] args) { case "exit": System.out.println("Bye bye!"); return; + case "log": + log(scanner); + break; + case "hardest card": + hardestCard(); + break; + case "reset stats": + resetStats(); + break; } } } } + private static void resetStats() { + stats.clear(); + System.out.printf("\n"); + } + + private static void hardestCard() { + Iterator> iterator = stats.entrySet().iterator(); + Entry maxErrors = iterator.hasNext() ? iterator.next() : null; + if (maxErrors == null) { + System.out.printf("No stats\n\n"); + return; + } + while (iterator.hasNext()) { + Entry cur = iterator.next(); + if (cur.getValue() > maxErrors.getValue()) { + maxErrors = cur; + } + } + System.out.printf("The hardest card is \"%s\". You have %d errors answering it.\n\n", + maxErrors.getKey(), maxErrors.getValue()); + } + + private static void log(Scanner scanner) { + System.out.println("File name:"); + String fileName = scanner.nextLine(); + logs.add(fileName); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName)); + PrintWriter print = new PrintWriter(writer)) { + for (String entry : logs) { + print.printf("%s\n", entry); + } + logs.clear(); + } catch (IOException e) { + System.out.printf("The log has not been saved.\n\n"); + return; + } + System.out.printf("The log has been saved..\n\n"); + } + private static void askCard(Scanner scanner) { System.out.println("How many times to ask?"); - int n = Integer.parseInt(scanner.nextLine()); + String num = scanner.nextLine(); + logs.add(num); + int n = Integer.parseInt(num); for (String card : cardToDefinition.keySet()) { if (n <= 0) { break; } System.out.printf("Print the definition of \"%s\":\n", card); String guess = scanner.nextLine(); + logs.add(guess); if (definitionToCard.containsKey(guess) && cardToDefinition.get(card).equals(guess)) { System.out.printf("Correct answer.\n"); } else if (definitionToCard.containsKey(guess)) { System.out.printf( "Wrong answer (the correct one is \"%s\", you've just written a definition of \"%s\" card).\n", cardToDefinition.get(card), definitionToCard.get(guess)); + stats.merge(card, 1, (x, y) -> x + y); } else { System.out .printf("Wrong answer (the correct one is \"%s\").\n", cardToDefinition.get(card)); + stats.merge(card, 1, (x, y) -> x + y); } n--; } @@ -74,6 +136,7 @@ private static void askCard(Scanner scanner) { private static void exportCard(Scanner scanner) { System.out.println("File name:"); String fileName = scanner.nextLine(); + logs.add(fileName); try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName)); PrintWriter print = new PrintWriter(writer)) { for (Entry entry : cardToDefinition.entrySet()) { @@ -89,6 +152,7 @@ private static void exportCard(Scanner scanner) { private static void importCard(Scanner scanner) { System.out.println("File name:"); String fileName = scanner.nextLine(); + logs.add(fileName); int count = 0; try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) { String card; @@ -111,6 +175,7 @@ private static void importCard(Scanner scanner) { private static void removeCard(Scanner scanner) { System.out.println("The card:"); String card = scanner.nextLine(); + logs.add(card); if (cardToDefinition.containsKey(card)) { String def = cardToDefinition.get(card); definitionToCard.remove(def); @@ -124,8 +189,10 @@ private static void removeCard(Scanner scanner) { private static void addCard(Scanner scanner) { System.out.println("The card:"); String card = scanner.nextLine(); + logs.add(card); System.out.println("The definition of the card:"); String definition = scanner.nextLine(); + logs.add(definition); cardToDefinition.put(card, definition); definitionToCard.put(definition, card); System.out.printf("The pair (\"%s\":\"%s\") is added.\n\n", card, definition); From c410021578163c97c620a3f245a9b094ea0e2ba8 Mon Sep 17 00:00:00 2001 From: oleksii Date: Thu, 20 Dec 2018 01:15:43 +0200 Subject: [PATCH 5/5] part six implemented --- src/flashcards/ActionsLogger.java | 25 +++ src/flashcards/Flashcards.java | 77 +++++++ src/flashcards/Main.java | 202 ++---------------- src/flashcards/command/AddCard.java | 28 +++ src/flashcards/command/AskCard.java | 51 +++++ src/flashcards/command/Command.java | 6 + src/flashcards/command/ExitCommand.java | 18 ++ src/flashcards/command/ExportCard.java | 41 ++++ src/flashcards/command/HardestCard.java | 32 +++ src/flashcards/command/ImportCard.java | 45 ++++ src/flashcards/command/RemoveCard.java | 27 +++ src/flashcards/command/ResetStat.java | 18 ++ src/flashcards/command/WriteLog.java | 38 ++++ .../command/factory/CommandFactory.java | 16 ++ .../factory/DefaultCommandFactory.java | 52 +++++ 15 files changed, 494 insertions(+), 182 deletions(-) create mode 100644 src/flashcards/ActionsLogger.java create mode 100644 src/flashcards/Flashcards.java create mode 100644 src/flashcards/command/AddCard.java create mode 100644 src/flashcards/command/AskCard.java create mode 100644 src/flashcards/command/Command.java create mode 100644 src/flashcards/command/ExitCommand.java create mode 100644 src/flashcards/command/ExportCard.java create mode 100644 src/flashcards/command/HardestCard.java create mode 100644 src/flashcards/command/ImportCard.java create mode 100644 src/flashcards/command/RemoveCard.java create mode 100644 src/flashcards/command/ResetStat.java create mode 100644 src/flashcards/command/WriteLog.java create mode 100644 src/flashcards/command/factory/CommandFactory.java create mode 100644 src/flashcards/command/factory/DefaultCommandFactory.java diff --git a/src/flashcards/ActionsLogger.java b/src/flashcards/ActionsLogger.java new file mode 100644 index 0000000..fdaf298 --- /dev/null +++ b/src/flashcards/ActionsLogger.java @@ -0,0 +1,25 @@ +package flashcards; + +import java.util.ArrayList; +import java.util.List; + +public class ActionsLogger { + + private List logs; + + public ActionsLogger() { + this.logs = new ArrayList<>(); + } + + public List getLogs() { + return logs; + } + + public void log(String action) { + logs.add(action); + } + + public void clear() { + logs.clear(); + } +} diff --git a/src/flashcards/Flashcards.java b/src/flashcards/Flashcards.java new file mode 100644 index 0000000..9ff9da8 --- /dev/null +++ b/src/flashcards/Flashcards.java @@ -0,0 +1,77 @@ +package flashcards; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +public class Flashcards { + + private Map cardToDefinition; + private Map definitionToCard; + + private Map stats; + + private boolean terminated; + + public Flashcards() { + this.cardToDefinition = new LinkedHashMap<>(); + this.definitionToCard = new LinkedHashMap<>(); + this.stats = new HashMap<>(); + this.terminated = false; + } + + public void addCard(String card, String definition) { + cardToDefinition.put(card, definition); + definitionToCard.put(definition, card); + } + + public void removeCard(String card) { + String def = cardToDefinition.get(card); + definitionToCard.remove(def); + cardToDefinition.remove(card); + } + + public boolean existsCard(String card) { + return cardToDefinition.containsKey(card); + } + + public boolean existsDefinition(String definition) { + return definitionToCard.containsKey(definition); + } + + public Map getStats() { + return stats; + } + + public void resetStats() { + stats.clear(); + } + + public boolean isTerminated() { + return terminated; + } + + public void setTerminated(boolean terminated) { + this.terminated = terminated; + } + + public Map getCards() { + return cardToDefinition; + } + + public void incStats(String answer) { + stats.merge(answer, 1, (x, y) -> x + y); + } + + public boolean isGuessed(String card, String guess) { + return definitionToCard.containsKey(guess) && cardToDefinition.get(card).equals(guess); + } + + public String getDefinition(String card) { + return cardToDefinition.get(card); + } + + public String getCard(String definition) { + return definitionToCard.get(definition); + } +} diff --git a/src/flashcards/Main.java b/src/flashcards/Main.java index eb8e178..ea9b50a 100644 --- a/src/flashcards/Main.java +++ b/src/flashcards/Main.java @@ -1,200 +1,38 @@ package flashcards; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import flashcards.command.Command; +import flashcards.command.factory.CommandFactory; import java.util.Scanner; public class Main { - private static Map cardToDefinition = new LinkedHashMap<>(); - private static Map definitionToCard = new LinkedHashMap<>(); - private static List logs = new ArrayList<>(); - private static Map stats = new HashMap<>(); + private Flashcards flashcards; + private CommandFactory commandFactory; - public static void main(String[] args) { - try (Scanner scanner = new Scanner(System.in)) { - while (true) { - System.out.println( - "Input the action (add, remove, import, export, ask, exit, log, hardest card, reset stats):"); - - String action = scanner.nextLine(); - - logs.add(action); - - switch (action) { - case "add": - addCard(scanner); - break; - case "remove": - removeCard(scanner); - break; - case "import": - importCard(scanner); - break; - case "export": - exportCard(scanner); - break; - case "ask": - askCard(scanner); - break; - case "exit": - System.out.println("Bye bye!"); - return; - case "log": - log(scanner); - break; - case "hardest card": - hardestCard(); - break; - case "reset stats": - resetStats(); - break; - } - } - } - } - - private static void resetStats() { - stats.clear(); - System.out.printf("\n"); - } - - private static void hardestCard() { - Iterator> iterator = stats.entrySet().iterator(); - Entry maxErrors = iterator.hasNext() ? iterator.next() : null; - if (maxErrors == null) { - System.out.printf("No stats\n\n"); - return; - } - while (iterator.hasNext()) { - Entry cur = iterator.next(); - if (cur.getValue() > maxErrors.getValue()) { - maxErrors = cur; - } - } - System.out.printf("The hardest card is \"%s\". You have %d errors answering it.\n\n", - maxErrors.getKey(), maxErrors.getValue()); + public Main(Flashcards flashcards, CommandFactory commandFactory) { + this.flashcards = flashcards; + this.commandFactory = commandFactory; } - private static void log(Scanner scanner) { - System.out.println("File name:"); - String fileName = scanner.nextLine(); - logs.add(fileName); - try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName)); - PrintWriter print = new PrintWriter(writer)) { - for (String entry : logs) { - print.printf("%s\n", entry); - } - logs.clear(); - } catch (IOException e) { - System.out.printf("The log has not been saved.\n\n"); - return; - } - System.out.printf("The log has been saved..\n\n"); - } + public void actionLoop(Scanner scanner) { + while (!flashcards.isTerminated()) { - private static void askCard(Scanner scanner) { - System.out.println("How many times to ask?"); - String num = scanner.nextLine(); - logs.add(num); - int n = Integer.parseInt(num); - for (String card : cardToDefinition.keySet()) { - if (n <= 0) { - break; - } - System.out.printf("Print the definition of \"%s\":\n", card); - String guess = scanner.nextLine(); - logs.add(guess); - if (definitionToCard.containsKey(guess) && cardToDefinition.get(card).equals(guess)) { - System.out.printf("Correct answer.\n"); - } else if (definitionToCard.containsKey(guess)) { - System.out.printf( - "Wrong answer (the correct one is \"%s\", you've just written a definition of \"%s\" card).\n", - cardToDefinition.get(card), definitionToCard.get(guess)); - stats.merge(card, 1, (x, y) -> x + y); - } else { - System.out - .printf("Wrong answer (the correct one is \"%s\").\n", cardToDefinition.get(card)); - stats.merge(card, 1, (x, y) -> x + y); - } - n--; - } - System.out.printf("\n"); - } + System.out.println( + "Input the action (add, remove, import, export, ask, exit, log, hardest card, reset stats):"); - private static void exportCard(Scanner scanner) { - System.out.println("File name:"); - String fileName = scanner.nextLine(); - logs.add(fileName); - try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName)); - PrintWriter print = new PrintWriter(writer)) { - for (Entry entry : cardToDefinition.entrySet()) { - print.printf("%s\n%s\n", entry.getKey(), entry.getValue()); - } - } catch (IOException e) { - System.out.printf("0 cards have been saved.\n\n"); - return; - } - System.out.printf("%d cards have been saved.\n\n", cardToDefinition.size()); - } + String action = scanner.nextLine(); - private static void importCard(Scanner scanner) { - System.out.println("File name:"); - String fileName = scanner.nextLine(); - logs.add(fileName); - int count = 0; - try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) { - String card; - while ((card = reader.readLine()) != null) { - String def = reader.readLine(); - if (def == null) { - break; - } - cardToDefinition.put(card, def); - definitionToCard.put(def, card); - count++; - } - } catch (IOException e) { - System.out.printf("0 cards have been saved.\n\n"); - return; + Command command = commandFactory.getCommand(action, scanner); + command.execute(); } - System.out.printf("%d cards have been saved.\n\n", count); } - private static void removeCard(Scanner scanner) { - System.out.println("The card:"); - String card = scanner.nextLine(); - logs.add(card); - if (cardToDefinition.containsKey(card)) { - String def = cardToDefinition.get(card); - definitionToCard.remove(def); - cardToDefinition.remove(card); - System.out.println("The card successfully removed\n\n"); - } else { - System.out.printf("Can't remove \"%s\": there is no such card.\n\n", card); + public static void main(String[] args) { + ActionsLogger actionsLogger = new ActionsLogger(); + Flashcards flashcards = new Flashcards(); + Main main = new Main(flashcards, CommandFactory.getDefault(flashcards,actionsLogger)); + try (Scanner scanner = new Scanner(System.in)) { + main.actionLoop(scanner); } } - - private static void addCard(Scanner scanner) { - System.out.println("The card:"); - String card = scanner.nextLine(); - logs.add(card); - System.out.println("The definition of the card:"); - String definition = scanner.nextLine(); - logs.add(definition); - cardToDefinition.put(card, definition); - definitionToCard.put(definition, card); - System.out.printf("The pair (\"%s\":\"%s\") is added.\n\n", card, definition); - } } \ No newline at end of file diff --git a/src/flashcards/command/AddCard.java b/src/flashcards/command/AddCard.java new file mode 100644 index 0000000..b97d806 --- /dev/null +++ b/src/flashcards/command/AddCard.java @@ -0,0 +1,28 @@ +package flashcards.command; + +import flashcards.Flashcards; +import java.util.Scanner; + +public class AddCard implements Command { + + private Flashcards flashcards; + private Scanner scanner; + + public AddCard(Flashcards flashcards, Scanner scanner) { + this.flashcards = flashcards; + this.scanner = scanner; + } + + @Override + public void execute() { + System.out.println("The card:"); + String card = scanner.nextLine(); + + System.out.println("The definition of the card:"); + String definition = scanner.nextLine(); + + flashcards.addCard(card, definition); + + System.out.printf("The pair (\"%s\":\"%s\") is added.\n\n", card, definition); + } +} diff --git a/src/flashcards/command/AskCard.java b/src/flashcards/command/AskCard.java new file mode 100644 index 0000000..22bd6bb --- /dev/null +++ b/src/flashcards/command/AskCard.java @@ -0,0 +1,51 @@ +package flashcards.command; + +import flashcards.ActionsLogger; +import flashcards.Flashcards; +import java.util.Scanner; + +public class AskCard implements Command { + + private Flashcards flashcards; + private Scanner scanner; + private ActionsLogger logger; + + public AskCard(Flashcards flashcards, Scanner scanner, ActionsLogger logger) { + this.flashcards = flashcards; + this.scanner = scanner; + this.logger = logger; + } + + @Override + public void execute() { + System.out.println("How many times to ask?"); + String num = scanner.nextLine(); + logger.log(num); + int n = Integer.parseInt(num); + for (String card : flashcards.getCards().keySet()) { + if (n <= 0) { + break; + } + System.out.printf("Print the definition of \"%s\":\n", card); + String guess = scanner.nextLine(); + logger.log(guess); + if (flashcards.isGuessed(card, guess)) { + System.out.printf("Correct answer.\n"); + } else if (flashcards.existsDefinition(guess)) { + String correctDefinition = flashcards.getDefinition(card); + String youMeanCard = flashcards.getCard(guess); + System.out.printf( + "Wrong answer (the correct one is \"%s\", you've just written a definition of \"%s\" card).\n", + correctDefinition, youMeanCard); + flashcards.incStats(card); + } else { + String correctCard = flashcards.getDefinition(card); + flashcards.incStats(card); + System.out + .printf("Wrong answer (the correct one is \"%s\").\n", correctCard); + } + n--; + } + System.out.printf("\n"); + } +} diff --git a/src/flashcards/command/Command.java b/src/flashcards/command/Command.java new file mode 100644 index 0000000..9197c76 --- /dev/null +++ b/src/flashcards/command/Command.java @@ -0,0 +1,6 @@ +package flashcards.command; + +public interface Command { + + void execute(); +} diff --git a/src/flashcards/command/ExitCommand.java b/src/flashcards/command/ExitCommand.java new file mode 100644 index 0000000..65dda96 --- /dev/null +++ b/src/flashcards/command/ExitCommand.java @@ -0,0 +1,18 @@ +package flashcards.command; + +import flashcards.Flashcards; + +public class ExitCommand implements Command { + + private Flashcards flashcards; + + public ExitCommand(Flashcards flashcards) { + this.flashcards = flashcards; + } + + @Override + public void execute() { + System.out.println("Bye bye!"); + flashcards.setTerminated(true); + } +} diff --git a/src/flashcards/command/ExportCard.java b/src/flashcards/command/ExportCard.java new file mode 100644 index 0000000..d00c3e7 --- /dev/null +++ b/src/flashcards/command/ExportCard.java @@ -0,0 +1,41 @@ +package flashcards.command; + +import flashcards.ActionsLogger; +import flashcards.Flashcards; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map.Entry; +import java.util.Scanner; + +public class ExportCard implements Command { + + private Flashcards flashcards; + private Scanner scanner; + private ActionsLogger logger; + + public ExportCard(Flashcards flashcards, Scanner scanner, ActionsLogger logger) { + this.flashcards = flashcards; + this.scanner = scanner; + this.logger = logger; + } + + @Override + public void execute() { + System.out.println("File name:"); + String fileName = scanner.nextLine(); + logger.log(fileName); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName)); + PrintWriter print = new PrintWriter(writer)) { + for (Entry entry : flashcards.getCards().entrySet()) { + print.printf("%s\n%s\n", entry.getKey(), entry.getValue()); + } + } catch (IOException e) { + System.out.printf("0 cards have been saved.\n\n"); + return; + } + System.out.printf("%d cards have been saved.\n\n", flashcards.getCards().size()); + } +} diff --git a/src/flashcards/command/HardestCard.java b/src/flashcards/command/HardestCard.java new file mode 100644 index 0000000..42c29a5 --- /dev/null +++ b/src/flashcards/command/HardestCard.java @@ -0,0 +1,32 @@ +package flashcards.command; + +import flashcards.Flashcards; +import java.util.Iterator; +import java.util.Map.Entry; + +public class HardestCard implements Command { + + private Flashcards flashcards; + + public HardestCard(Flashcards flashcards) { + this.flashcards = flashcards; + } + + @Override + public void execute() { + Iterator> iterator = flashcards.getStats().entrySet().iterator(); + Entry maxErrors = iterator.hasNext() ? iterator.next() : null; + if (maxErrors == null) { + System.out.printf("No stats\n\n"); + return; + } + while (iterator.hasNext()) { + Entry cur = iterator.next(); + if (cur.getValue() > maxErrors.getValue()) { + maxErrors = cur; + } + } + System.out.printf("The hardest card is \"%s\". You have %d errors answering it.\n\n", + maxErrors.getKey(), maxErrors.getValue()); + } +} diff --git a/src/flashcards/command/ImportCard.java b/src/flashcards/command/ImportCard.java new file mode 100644 index 0000000..5509953 --- /dev/null +++ b/src/flashcards/command/ImportCard.java @@ -0,0 +1,45 @@ +package flashcards.command; + +import flashcards.ActionsLogger; +import flashcards.Flashcards; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Scanner; + +public class ImportCard implements Command { + + private Flashcards flashcards; + private Scanner scanner; + private ActionsLogger logger; + + public ImportCard(Flashcards flashcards, Scanner scanner, ActionsLogger logger) { + this.flashcards = flashcards; + this.scanner = scanner; + this.logger = logger; + } + + @Override + public void execute() { + System.out.println("File name:"); + String fileName = scanner.nextLine(); + logger.log(fileName); + int count = 0; + try (BufferedReader reader = Files.newBufferedReader(Paths.get(fileName))) { + String card; + while ((card = reader.readLine()) != null) { + String def = reader.readLine(); + if (def == null) { + break; + } + flashcards.addCard(card, def); + count++; + } + } catch (IOException e) { + System.out.printf("0 cards have been saved.\n\n"); + return; + } + System.out.printf("%d cards have been saved.\n\n", count); + } +} diff --git a/src/flashcards/command/RemoveCard.java b/src/flashcards/command/RemoveCard.java new file mode 100644 index 0000000..7ff7e1e --- /dev/null +++ b/src/flashcards/command/RemoveCard.java @@ -0,0 +1,27 @@ +package flashcards.command; + +import flashcards.Flashcards; +import java.util.Scanner; + +public class RemoveCard implements Command { + + private Flashcards flashcards; + private Scanner scanner; + + public RemoveCard(Flashcards flashcards, Scanner scanner) { + this.flashcards = flashcards; + this.scanner = scanner; + } + + @Override + public void execute() { + System.out.println("The card:"); + String card = scanner.nextLine(); + if (flashcards.existsCard(card)) { + flashcards.removeCard(card); + System.out.println("The card successfully removed\n\n"); + } else { + System.out.printf("Can't remove \"%s\": there is no such card.\n\n", card); + } + } +} diff --git a/src/flashcards/command/ResetStat.java b/src/flashcards/command/ResetStat.java new file mode 100644 index 0000000..d05e48b --- /dev/null +++ b/src/flashcards/command/ResetStat.java @@ -0,0 +1,18 @@ +package flashcards.command; + +import flashcards.Flashcards; + +public class ResetStat implements Command { + + private Flashcards flashcards; + + public ResetStat(Flashcards flashcards) { + this.flashcards = flashcards; + } + + @Override + public void execute() { + flashcards.resetStats(); + System.out.printf("\n"); + } +} diff --git a/src/flashcards/command/WriteLog.java b/src/flashcards/command/WriteLog.java new file mode 100644 index 0000000..27cc4b4 --- /dev/null +++ b/src/flashcards/command/WriteLog.java @@ -0,0 +1,38 @@ +package flashcards.command; + +import flashcards.ActionsLogger; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Scanner; + +public class WriteLog implements Command { + + private ActionsLogger log; + private Scanner scanner; + + public WriteLog(ActionsLogger log, Scanner scanner) { + this.log = log; + this.scanner = scanner; + } + + @Override + public void execute() { + System.out.println("File name:"); + String fileName = scanner.nextLine(); + log.log(fileName); + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName)); + PrintWriter print = new PrintWriter(writer)) { + for (String entry : log.getLogs()) { + print.printf("%s\n", entry); + } + log.clear(); + } catch (IOException e) { + System.out.printf("The log has not been saved.\n\n"); + return; + } + System.out.printf("The log has been saved..\n\n"); + } +} diff --git a/src/flashcards/command/factory/CommandFactory.java b/src/flashcards/command/factory/CommandFactory.java new file mode 100644 index 0000000..3375bca --- /dev/null +++ b/src/flashcards/command/factory/CommandFactory.java @@ -0,0 +1,16 @@ +package flashcards.command.factory; + +import flashcards.ActionsLogger; +import flashcards.Flashcards; +import flashcards.command.Command; +import java.util.Scanner; + +public interface CommandFactory { + + Command getCommand(String action, Scanner scanner); + + static CommandFactory getDefault(Flashcards flashcards, ActionsLogger actionsLogger) { + return new DefaultCommandFactory(flashcards,actionsLogger); + } + +} diff --git a/src/flashcards/command/factory/DefaultCommandFactory.java b/src/flashcards/command/factory/DefaultCommandFactory.java new file mode 100644 index 0000000..cd6030a --- /dev/null +++ b/src/flashcards/command/factory/DefaultCommandFactory.java @@ -0,0 +1,52 @@ +package flashcards.command.factory; + +import flashcards.ActionsLogger; +import flashcards.Flashcards; +import flashcards.command.AddCard; +import flashcards.command.AskCard; +import flashcards.command.Command; +import flashcards.command.ExitCommand; +import flashcards.command.ExportCard; +import flashcards.command.HardestCard; +import flashcards.command.ImportCard; +import flashcards.command.RemoveCard; +import flashcards.command.ResetStat; +import flashcards.command.WriteLog; +import java.util.Scanner; + +class DefaultCommandFactory implements CommandFactory { + + private Flashcards flashcards; + private ActionsLogger logger; + + public DefaultCommandFactory(Flashcards flashcards, ActionsLogger actionsLogger) { + this.flashcards = flashcards; + logger = actionsLogger; + } + + @Override + public Command getCommand(String action, Scanner scanner) { + logger.log(action); + switch (action) { + case "add": + return new AddCard(flashcards, scanner); + case "remove": + return new RemoveCard(flashcards, scanner); + case "import": + return new ImportCard(flashcards, scanner, logger); + case "export": + return new ExportCard(flashcards, scanner, logger); + case "ask": + return new AskCard(flashcards, scanner, logger); + case "exit": + return new ExitCommand(flashcards); + case "log": + return new WriteLog(logger, scanner); + case "hardest card": + return new HardestCard(flashcards); + case "reset stats": + return new ResetStat(flashcards); + } + return null; + } +}