Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 25 additions & 0 deletions src/flashcards/ActionsLogger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package flashcards;

import java.util.ArrayList;
import java.util.List;

public class ActionsLogger {

private List<String> logs;

public ActionsLogger() {
this.logs = new ArrayList<>();
}

public List<String> getLogs() {
return logs;
}

public void log(String action) {
logs.add(action);
}

public void clear() {
logs.clear();
}
}
77 changes: 77 additions & 0 deletions src/flashcards/Flashcards.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package flashcards;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class Flashcards {

private Map<String, String> cardToDefinition;
private Map<String, String> definitionToCard;

private Map<String, Integer> 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<String, Integer> getStats() {
return stats;
}

public void resetStats() {
stats.clear();
}

public boolean isTerminated() {
return terminated;
}

public void setTerminated(boolean terminated) {
this.terminated = terminated;
}

public Map<String, String> 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);
}
}
35 changes: 33 additions & 2 deletions src/flashcards/Main.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
28 changes: 28 additions & 0 deletions src/flashcards/command/AddCard.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
51 changes: 51 additions & 0 deletions src/flashcards/command/AskCard.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
6 changes: 6 additions & 0 deletions src/flashcards/command/Command.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package flashcards.command;

public interface Command {

void execute();
}
18 changes: 18 additions & 0 deletions src/flashcards/command/ExitCommand.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
41 changes: 41 additions & 0 deletions src/flashcards/command/ExportCard.java
Original file line number Diff line number Diff line change
@@ -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<String, String> 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());
}
}
32 changes: 32 additions & 0 deletions src/flashcards/command/HardestCard.java
Original file line number Diff line number Diff line change
@@ -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<Entry<String, Integer>> iterator = flashcards.getStats().entrySet().iterator();
Entry<String, Integer> maxErrors = iterator.hasNext() ? iterator.next() : null;
if (maxErrors == null) {
System.out.printf("No stats\n\n");
return;
}
while (iterator.hasNext()) {
Entry<String, Integer> 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());
}
}
45 changes: 45 additions & 0 deletions src/flashcards/command/ImportCard.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Loading