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; + } +}