Ejercicios Strings y Fechas

Vamos a crear las siguientes clases

Una clase llamada ManipularCadenas que sólo tendrá una variable String privada que se incializa en el contructor.

Tendrá los siguientes métodos públicos:

String getCadena()-> Getter de la cadena (pero no setter)

void repetir(String cadena)

Si nuestra cadena tiene dentro la cadena que le pasamos, la repite. Si no, no hace nada.
Ejemplo: Si mi cadena es ‘hola que tal’
repetir(«cacahuete»)-> No modifica la cadena
repetir(‘que’)-> Mi cadena pasa a valer ‘hola queque tal’
Sólo la primera aparición

void erosionar()

Nos elimina el primer y el último carácter de la cadena si tiene una longitud mayor o igual a 2

Si mi cadena es ‘hola que tal’->’ola que ta’

void agujero

Nos elimina el caracter que están en el medio. Si la longitud es par, los dos que están en el medio

Si mi cadena es ‘hola que tal’->’hola e tal’

Todas estas funciones modifican el valor de la cadena dentro de la clase. Ni imprimen por pantalla ni devuelven nada. Si queremos ver si funcionan necesitaremos llamar al getter para ver el valor.

Estamos dentro de una clase, que tendrá su propio archivo. Para probarla vamos a crear en otra parte un Main y crearemos una instancia de la clase.

Vamos a crear una clase CitasMedico que va a tener como propiedades un array de Fechas.

Vamos a tener un constructor sobrecargado de tres maneras:
Sin parámetros
Parámetro String
Parámetro LocalDate

En este último crearemos en el array de fechas 12 fechas de la manera siguiente:
El primer elemento es la fecha que nos pasan.
El segundo elemento es la fecha que nos pasan mas 15 días.
El tercero lo mismo más 15 días.
Y así sucesivamente.

Si alguno de los elementos cae en fin de semana se pasa al lunes siguiente.
Imaginemos que lo hacemos con la fecha de hoy. Tendríamos las siguientes fechas:
6/4/2021
21/4/2021
6/5/2021
21/5/2021
5/6/2021–> Es sábado, así que pasa a ser 7/6/2021
20/5/2021–>Es domingo, así que pasa a ser 21/5/2021

El constructor con un string parsea el string a fecha y llama al constructor de fecha.
EL constructor sin parámetros llama al constructor de fecha con fecha de hoy.

Además crearemos un método público próxima cita que nos devuelva, de nuestro array de fechas, la siguiente que nos tocaría.

LocalDate proximaCita()

La clase ManipulaCadena:

package com.trifulcas.ejercicio01;

public class ManipulaCadenas {
	private String cadena;

	public ManipulaCadenas(String cadena) {
		this.cadena = cadena;
	}

	public String getCadena() {
		return cadena;
	}

	/**
	 * Busca la cadena dentro de la propiedad de la clase Y si está, la repite
	 * 
	 * @param cad La cadena a buscar
	 * 
	 */
	public void repetir(String cad) {
		// Averiguar si la cadena que me pasan como parámetro
		// Está dentro de la cadena de la clase
		// Si no está no hago nada
		// Si está inserto la cadena que me pasan en la posición
		// de la cadena
		int pos = cadena.indexOf(cad);
		if (pos != -1) {
			// '123456789' y busco '34' está en la posición '2'
			// Yo tengo que insertar '34' en la posición 2
			// Manera 1 usando insert de StringBuilder
			StringBuilder temp = new StringBuilder(cadena);
			temp.insert(pos, cad); // '12343456789'
			// cadena = temp.toString();
			// Manera 2 lo mismo pero compacto
			cadena = new StringBuilder(cadena).insert(pos, cad).toString();

			// Manera 3 usando substring
			// cadena = cadena.substring(0, pos) + cad + cadena.substring(pos);
		}

	}

	/**
	 * Elimina el primer carácter y el último de la cadena si su longitud es mayor a
	 * 2
	 */
	public void erosionar() {
		// Compruebo si tiene longitud>2
		// Si es así quito el caracter 1º y último
		if (cadena.length() >= 2) {
			// No me complico y uso substring
			// cadena = cadena.substring(1, cadena.length() - 1);

			// Me aprovecho de las funcionalidades de StringBuilder
			cadena = new StringBuilder(cadena).deleteCharAt(cadena.length() - 1).deleteCharAt(0).toString();
		}
	}

	/**
	 * Elimina los carcateres centrales Si la longitud de la cadena es par, los dos
	 * del medio Si es impar el carácter central
	 */
	public void agujero() {
		if (cadena.length() > 0) {
			// Par o impar
			// Si es par quitar los caracteres del medio
			// Si es impar quitar el carácter del medio
			if (cadena.length() % 2 == 0) {
				// Es par: los dos del medio
				// 'abcdef' 2,3 longitud: 6 6/2-1
				// 'abcd' 1,2 longitud 4 4/2-1
				// 'abcdefgh' 3,4 longitud 8 8/2-1
				int pos = cadena.length() / 2 - 1;
				cadena = new StringBuilder(cadena).delete(pos, pos + 2).toString();

			} else {
				// Es impar: el del medio
				// 'abcde' 2 longitud 5 5/2->2
				// 'abcdefg' 3 longitud es 7/2 ->3
				int pos = (cadena.length() - 1) / 2;
				cadena = new StringBuilder(cadena).deleteCharAt(pos).toString();
			}
		}
	}
}

Probar esta clase:

package com.trifulcas.ejercicio01;

public class Test {

	public static void main(String[] args) {
		ManipulaCadenas temp=new ManipulaCadenas("Hola que tal");
	
		ManipulaCadenas numeros=new ManipulaCadenas("123456789");

		temp.repetir("que");
		System.out.println(temp.getCadena());
		temp.erosionar();
		System.out.println(temp.getCadena());
		temp.agujero();
		System.out.println(temp.getCadena());
		numeros.agujero();
		System.out.println(numeros.getCadena());
	}

}
package com.trifulcas.ejercicio01;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Arrays;

public class CitasMedico {
	private LocalDate[] fechas;

	public CitasMedico() {
		// LLamo al constructor con parámetro fecha con la fecha de hoy
		this(LocalDate.now());
	}

	public CitasMedico(String fecha) {
		// Parseo la fecha y llamo al constructor con parámetro fecha
		this(LocalDate.parse(fecha));
	}

	public CitasMedico(LocalDate fecha) {
		// Crearé el array con un tamaño de 12
		// Voy a ir añadiendo las fechas sumando 15 días
		// Hay que comprobar que no sea fin de semana
		this(fecha, 15);
	}

	public CitasMedico(LocalDate fecha, int dias) {
		// Crearé el array con un tamaño de 12
		// Voy a ir añadiendo las fechas sumando 15 días
		// Hay que comprobar que no sea fin de semana
		fechas = new LocalDate[12];
		fechas[0] = siguienteLaborable(fecha);
		for (int i = 1; i < fechas.length; i++) {
			fechas[i] = siguienteLaborable(fechas[i - 1].plusDays(dias));
		}
	}

	/**
	 * Busca el siguiente día laborable. Si la fecha es sábado o domingo pasa al
	 * lunes
	 * 
	 * @param fecha La fecha a comprobar
	 * @return El siguiente día laborable a la fecha
	 */
	private LocalDate siguienteLaborable(LocalDate fecha) {

		// Si es sábado pasamos al lunes sumando dos días
		if (fecha.getDayOfWeek() == DayOfWeek.SATURDAY) {
			fecha = fecha.plusDays(2);
		}
		// Si es domingo pasamos al lunes sumando 1 día
		if (fecha.getDayOfWeek() == DayOfWeek.SUNDAY) {
			fecha = fecha.plusDays(1);
		}
		return fecha;
	}

	public LocalDate proximaCita() {
		// Devolveremos la próxima cita a partir de hoy	
		for(int i=0;i<fechas.length;i++) {
			if (fechas[i].isAfter(LocalDate.now())) {
				return fechas[i];
			}
		}
		return null;
	}

	public LocalDate proximaCitaFeten() {
		// Devolveremos la próxima cita a partir de hoy	
		LocalDate res=null;
		for(int i=0;i<fechas.length;i++) {
			if (fechas[i].isAfter(LocalDate.now())) {
				res=fechas[i];
				break;
			}
		}
		return res;
	}
	
	public LocalDate proximaCitaDesordenada() {
		// Devolveremos la próxima cita a partir de hoy	
		LocalDate res=null;
		for(int i=0;i<fechas.length;i++) {
			if (fechas[i].isAfter(LocalDate.now())) {
				if (res==null || res.isAfter(fechas[i]))
				res=fechas[i];
			}
		}
		return res;
	}
	public String toString() {
		return Arrays.toString(fechas);
	}
}

Probar la clase:

public static void main(String[] args) {
		CitasMedico temp = new CitasMedico(LocalDate.now());
		CitasMedico temp2 = new CitasMedico("2021-03-02");
		CitasMedico temp3=new CitasMedico();

		CitasMedico temp4 = new CitasMedico(LocalDate.now(),20);

		System.out.println(temp2);
		System.out.println(temp2.proximaCita());
	}