Función base de datos de tareas Curso de Programación Java

Lección:

Funciones


Ejercicio:

Función base de datos de tareas 38


Objetivo:

Cree una versión mejorada de la "base de datos de tareas", dividiéndola en funciones.


Código:

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');
	}
}