import java.util.*;
public class Main
{
private final static class DateType
{
public short year;
public byte month;
public byte day;
public DateType clone()
{
DateType varCopy = new DateType();
varCopy.year = this.year;
varCopy.month = this.month;
varCopy.day = this.day;
return varCopy;
}
}
private final static class TaskType
{
public DateType date = new DateType();
public String description;
public byte level;
public String category;
public TaskType clone()
{
TaskType varCopy = new TaskType();
varCopy.date = this.date.clone();
varCopy.description = this.description;
varCopy.level = this.level;
varCopy.category = this.category;
return varCopy;
}
}
private static int counter = 0;
private static int capacity = 2000;
private static TaskType[] tasks = new TaskType[capacity];
public static void Add()
{
if (counter < capacity)
{
System.out.print("Enter the Description of the task: ");
tasks[counter].description = new Scanner(System.in).nextLine();
System.out.print("Enter the Level of the task (1-10): ");
tasks[counter].level = Byte.parseByte(new Scanner(System.in).nextLine());
System.out.print("Enter the Category of the task: ");
tasks[counter].category = new Scanner(System.in).nextLine();
do
{
System.out.print("Enter the Day of the task (1 to 31): ");
tasks[counter].date.day = Byte.parseByte(new Scanner(System.in).nextLine());
if (tasks[counter].date.day < 1 || tasks[counter].date.day > 31)
{
System.out.println("Not a valid day!");
}
} while (tasks[counter].date.day < 1 || tasks[counter].date.day > 31);
do
{
System.out.print("Enter the Month of the task (1 to 12): ");
tasks[counter].date.month = Byte.parseByte(new Scanner(System.in).nextLine());
if (tasks[counter].date.month < 1 || tasks[counter].date.month > 12)
{
System.out.println("Not a valid month!");
}
} while (tasks[counter].date.month < 1 || tasks[counter].date.month > 12);
do
{
System.out.print("Enter the Year of the task: ");
tasks[counter].date.year = Short.parseShort(new Scanner(System.in).nextLine());
if (tasks[counter].date.year < 1000 || tasks[counter].date.year > 3000)
{
System.out.println("Not a valid year!");
}
} while (tasks[counter].date.year < 1000 || tasks[counter].date.year > 3000);
counter++;
}
else
{
System.out.println("Database full.");
}
}
public static void Show()
{
if (counter >= 1)
{
byte startDay, startMonth;
short startYear;
byte endDay, endMonth;
short endYear;
System.out.println("Starting day: ");
String number = new Scanner(System.in).nextLine();
if (number.equals(""))
{
startDay = (byte)java.time.LocalDateTime.now().getDayOfMonth();
}
else
{
startDay = Byte.parseByte(number);
}
System.out.println("Starting month: ");
number = new Scanner(System.in).nextLine();
if (number.equals(""))
{
startMonth = (byte)java.time.LocalDateTime.now().getMonthValue();
}
else
{
startMonth = Byte.parseByte(number);
}
System.out.println("Starting year: ");
number = new Scanner(System.in).nextLine();
if (number.equals(""))
{
startYear = (short)java.time.LocalDateTime.now().getYear();
}
else
{
startYear = Short.parseShort(number);
}
System.out.println("Final day: ");
number = new Scanner(System.in).nextLine();
if (number.equals(""))
{
endDay = (byte)java.time.LocalDateTime.now().getDayOfMonth();
}
else
{
endDay = Byte.parseByte(number);
}
System.out.println("Final month: ");
number = new Scanner(System.in).nextLine();
if (number.equals(""))
{
endMonth = (byte)java.time.LocalDateTime.now().getMonthValue();
}
else
{
endMonth = Byte.parseByte(number);
}
System.out.println("Final year: ");
number = new Scanner(System.in).nextLine();
if (number.equals(""))
{
endYear = (short)java.time.LocalDateTime.now().getYear();
}
else
{
endYear = Short.parseShort(number);
}
String startDate = "" + startYear + (new Byte(startMonth)).toString("00") + (new Byte(startDay)).toString("00");
String endDate = "" + endYear + (new Byte(endMonth)).toString("00") + (new Byte(endDay)).toString("00");
for (int i = 0; i < counter; i++)
{
String currentDate = "" + tasks[i].date.year +
(new Byte(tasks[i].date.month)).toString("00") +
(new Byte(tasks[i].date.day)).toString("00");
if (currentDate.compareTo(startDate) >= 0 && currentDate.compareTo(endDate) <= 0)
{
System.out.printf("The number is %1$s: %2$s/%3$s/" + "%4$s - %5$s - %6$s - %7$s." +
"\r\n", i + 1, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year,
tasks[i].description, tasks[i].category, tasks[i].level);
}
}
}
else
{
System.out.println("Database empty.");
}
}
public static void Find()
{
String search;
boolean found;
if (counter >= 1)
{
System.out.print("Enter the text to search: ");
search = new Scanner(System.in).nextLine();
found = false;
String newValue5;
for (int i = 0; i < counter; i++)
{
if (tasks[i].description.indexOf(search) >= 0 || tasks[i].category.indexOf(search) >= 0)
{
if (tasks[i].description.length() > 50)
{
newValue5 = tasks[i].description.substring(0, 50);
}
else
{
newValue5 = tasks[i].description;
}
found = true;
System.out.printf("%1$s: %2$s/%3$s/%4$s - %5$s" + "\r\n", i + 1, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year, newValue5);
}
}
if (!found)
{
System.out.println("Not found.");
}
}
else
{
System.out.println("Database empty.");
}
}
public static void Update()
{
String newValue;
if (counter >= 1)
{
System.out.print("Enter the number of the task to update: ");
int update = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;
if ((update >= 0) && (update < counter))
{
System.out.printf("Description (%1$s): ", tasks[update].description);
newValue = new Scanner(System.in).nextLine();
if (!newValue.equals(""))
{
tasks[update].description = newValue;
}
System.out.printf("Level (%1$s): " + "\r\n", tasks[update].level);
newValue = new Scanner(System.in).nextLine();
if (!newValue.equals(""))
{
tasks[update].level = Byte.parseByte(newValue);
}
System.out.printf("Category (%1$s): " + "\r\n", tasks[update].category);
newValue = new Scanner(System.in).nextLine();
if (!newValue.equals(""))
{
tasks[update].category = newValue;
}
System.out.printf("Year (%1$s): " + "\r\n", tasks[update].date.year);
newValue = new Scanner(System.in).nextLine();
if (!newValue.equals(""))
{
tasks[update].date.year = Short.parseShort(newValue);
}
System.out.printf("Month (%1$s): " + "\r\n", tasks[update].date.month);
newValue = new Scanner(System.in).nextLine();
if (!newValue.equals(""))
{
tasks[update].date.month = Byte.parseByte(newValue);
}
System.out.printf("Day (%1$s): " + "\r\n", tasks[update].date.day);
newValue = new Scanner(System.in).nextLine();
if (!newValue.equals(""))
{
tasks[update - 1].date.day = Byte.parseByte(newValue);
}
}
else
{
System.out.println("Wrong number entered.");
}
}
else
{
System.out.println("Database empty.");
}
}
public static void Delete()
{
if (counter >= 1)
{
System.out.print("Enter the first number of data to delete: ");
int delete = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;
System.out.print("Enter the second number of data to delete: ");
int delete2 = Integer.parseInt(new Scanner(System.in).nextLine()) - 1;
for (int pos = delete; pos <= delete2; pos++)
{
for (int i = delete2; i < counter; i++)
{
tasks[i] = tasks[i + 1];
}
counter--;
}
}
else
{
System.out.println("Database empty.");
}
}
public static void Sort()
{
for (int i = 0; i < counter - 1; i++)
{
String firstDate = "" + tasks[i].date.year + (new Byte(tasks[i].date.month)).toString("00") + (new Byte(tasks[i].date.day)).toString("00") + tasks[i].description;
for (int j = i + 1; j < counter; j++)
{
String secondDate = "" + tasks[j].date.year + (new Byte(tasks[j].date.month)).toString("00") + (new Byte(tasks[j].date.day)).toString("00") + tasks[j].description;
if (firstDate.compareTo(secondDate) > 0)
{
TaskType aux = tasks[i];
tasks[i] = tasks[j];
tasks[j] = aux.clone();
}
}
}
}
public static void FindDuplicates()
{
for (int i = 0; i < counter - 1; i++)
{
for (int j = i + 1; j < counter; j++)
{
if (tasks[i].description.equals(tasks[j].description))
{
System.out.printf("%1$s - %2$s/%3$s/%4$s" + "\r\n", tasks[i].description, tasks[i].date.day, tasks[i].date.month, tasks[i].date.year);
System.out.printf("%1$s - %2$s/%3$s/%4$s" + "\r\n", tasks[j].description, tasks[j].date.day, tasks[j].date.month, tasks[j].date.year);
}
}
}
}
public static void main()
{
char option;
do
{
System.out.println();
System.out.println("Tasks database");
System.out.println();
System.out.println("1- Add a new task.");
System.out.println("2- Show the tasks between two certain dates.");
System.out.println("3- Find tasks that contain a certain text.");
System.out.println("4- Update a record.");
System.out.println("5- Delete some data, between two positions indicated.");
System.out.println("6- Sort the data alphabetically by date.");
System.out.println("7- Find Duplicates.");
System.out.println("Q- Quit.");
System.out.println("Enter an option:");
option = (char)(new Scanner(System.in).nextLine().toUpperCase());
switch (option)
{
case '1': //Add a new task
Add();
break;
case '2': //Show the tasks between two certain dates
Show();
break;
case '3': //Find tasks that contain a certain text
Find();
break;
case '4': //Update a record
Update();
break;
case '5': //Delete some data, between two positions indicated by the user
Delete();
break;
case '6': //Sort the data alphabetically on date + description
Sort();
break;
case '7': //Find Duplicates
FindDuplicates();
break;
case 'Q': //Quit
System.out.println("Quitting...");
break;
default:
System.out.println("You entered a wrong option. Please re-enter it.");
break;
}
} while (option != 'Q');
}
}