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/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 d1b036c..ea9b50a 100644
--- a/src/flashcards/Main.java
+++ b/src/flashcards/Main.java
@@ -1,7 +1,38 @@
package flashcards;
+import flashcards.command.Command;
+import flashcards.command.factory.CommandFactory;
+import java.util.Scanner;
+
public class Main {
- public static void main(String[] args) {
- System.out.print("Hello world!");
+
+ private Flashcards flashcards;
+ private CommandFactory commandFactory;
+
+ public Main(Flashcards flashcards, CommandFactory commandFactory) {
+ this.flashcards = flashcards;
+ this.commandFactory = commandFactory;
+ }
+
+ public void actionLoop(Scanner scanner) {
+ while (!flashcards.isTerminated()) {
+
+ System.out.println(
+ "Input the action (add, remove, import, export, ask, exit, log, hardest card, reset stats):");
+
+ String action = scanner.nextLine();
+
+ Command command = commandFactory.getCommand(action, scanner);
+ command.execute();
+ }
+ }
+
+ 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);
}
+ }
}
\ 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;
+ }
+}