Esta línea que señalo en rojo debería ir en el método de comprobarHoras
if (partes.length == 3){
if (comprobarSemana(partes[0])) {//if 1 comprobar el dia de la semana
if (partes.length != 2){ //Formato mal if 2 comprobar el formato de la hora 00:00
System.out.println("\n \t"+partes[0] + " no esta escrito en el formato establecido 00:00.");
Porque ahí, ese "partes" es el array que tiene las tres partes del horario: dia,inicio,fin
Lo de validar longitud igual 2, es para el array "partes" que está en el método comprobar horas.
Aunque los arrays se llamen igual, no tienen ninguna relación entre ellos, porque están en métodos/ámbitos distintos.
Quizás habría sido mejor idea no llamarlos igual para evitar estas confusiones, pero bueno.
Otra cosa que va a fallar en el método, son los if que mostraré a continuación, seguramente el compilador se quejará de que falta un return.
Cuando hacemos return mediante if, tenemos que garantizar dos return, para cuando se cumple la condición que evaluamos y para cuando no se cumple.
El primer if, el que señalo en verde, tiene ambos return garantizados. Pero el segundo if, el que marco en rojo, solo tiene return para cuando SÍ se cumple la condición, pero NO para cuando no la tiene, y esto el compilador no lo puede aceptar.
if (hh >= 0 && hh <= 23){ //Las horas son correctas
if (mm >= 0 && mm <= 59) //Los minutos son correctos
return true;
} else
return false ;
En este método hay muchas comprobaciones y es fácil que nos equivoquemos y no proporcionemos un return para cada posibilidad.
Para facilitarlo, podemos cambiar la estrategia.
En los if solo preguntaremos si "está mal", en cuyo caso haremos un
return false;Luego al final del método, la última línea, será un
return true; sin ninguna condición.
De esta manera, si se encuentra "algo mal", algún return false habrá puesto fin al método.
Si no ha ocurrido ningún return false, es porque TODO está bien, por lo tanto podemos hacer tranquilamente un retun true.
Así no nos liamos y el compilador quedará contento, pues como hay un return al final que no depende de ninguna condición, queda garantizado que el método podrá finalizar en cualquier caso.
Podría quedar del siguiente modo.
Fíjate que añado algo que no comenté antes, un
try catch para capturar posibles excepciones al parsear horas y minutos.
Esto es importante, porque imagina que el usuario introduce esto:
h5:9mSon dos elementos, correcto.
Cada elemento tiene dos caracteres, correcto.
Pero al intentar parsear eso a números, no va a ser posible porque hay letras. Y se producirá una excepción y el programa se interrumpirá lanzando mensaje de error, a no ser que controlemos esa posible excepción con
try catch public static boolean comprobarHoras(String hora) {
String[] partes = hora.split(":");
if (partes.length != 2)
return false; //No hemos obtenido un array de dos elementos
else {
//Sí tenemos dos elementos, pero ambos elementos han de tener longitud de 2 caracteres
if (partes[0].length() != 2 || partes[1].length() != 2)
return false;//Uno, o ambos elementos, no tienen dos caracteres
else {
//Ambos elementos tienen dos caracteres.
//Los parseamos a enteros para comprobar si son horas y minutos válidos
//Usamos try catch por si los caracteres no son números parseables
try {
int hh = Integer.parseInt(partes[0]);
int mm = Integer.parseInt(partes[1]);
//Comprobamos horas
if (hh < 0 || hh >= 24)
return false; //Horas incorrectas
if (mm < 0 || mm >= 60)
return false; //Minutos incorrectos
}
catch(NumberFormatException ex) {
return false;//Usuario no ha tecleado números
}
}
}
return true; //Todas las comprobaciones han sido correctas
}
Con este método ya podríamos comprobar ambas horas.
Por cierto, lo de repetir "mientras flag == 3", no lo veo claro, porque solo repetiría si damos tres elementos.
Si damos más o menos, ha de indicar el error, pero estaría bien que siguiera pidiendo cadenas.
Quizás podríamos hacer que se repita hasta que el usuario introduzca la cadena "salir"
public class Main
{
public static void main(String[] args) {
Scanner scn = new Scanner(System.in);
String cadena ="";
while (!cadena.equals("salir")){
if (!cadena.equals("salir")) {
System.out.println("\n\t Ingresa la cadena de texto con el formato indicado");
System.out.println("\t Dia de la semana,hora de inicio, hora final.");
System.out.println("\t Escriba \"salir\" para terminar programa");
System.out.print("\n\t Cadena: ");
cadena = scn.nextLine();
String[] partes = cadena.split(",");
if (partes.length == 3){
if (comprobarSemana(partes[0])) {//if 1 comprobar el dia de la semana
if (comprobarHoras(partes[1]) && comprobarHoras(partes[2])) {
//Ahora hay que comprobar que la hora de partes[1] es anterior a la de partes[2]
}
else
System.out.println("Formato de horas incorrecto. El fomato ha de ser hh:mm");
}// cierre if 1
else
System.out.println("\n \t"+partes[0] + " no es un dia de la semana.");
}
}
else //No hemos obtenido 3 partes
System.out.println("La cadena ingresada es incorrecta favor de verificar el formato \n");
}
System.out.println("Fin de programa");
}
//Declaracion metodo comprobarSemana
public static boolean comprobarSemana(String dia) {
boolean comprobacionSemana = false;
if(dia.equals("lunes") || dia.equals("martes") || dia.equals("miercoles") || dia.equals("jueves") || dia.equals("viernes")
|| dia.equals("sabado") || dia.equals("domingo"))
return true;
else
return false;
}
public static boolean comprobarHoras(String hora) {
String[] partes = hora.split(":");
if (partes.length != 2)
return false; //No hemos obtenido un array de dos elementos
else {
//Sí tenemos dos elementos, pero ambos elementos han de tener longitud de 2 caracteres
if (partes[0].length() != 2 || partes[1].length() != 2)
return false;//Uno, o ambos elementos, no tienen dos caracteres
else {
//Ambos elementos tienen dos caracteres.
//Los parseamos a enteros para comprobar si son horas y minutos válidos
//Usamos try catch por si los caracteres no son números parseables
try {
int hh = Integer.parseInt(partes[0]);
int mm = Integer.parseInt(partes[1]);
//Comprobamos horas
if (hh < 0 || hh >= 24)
return false; //Horas incorrectas
if (mm < 0 || mm >= 60)
return false; //Minutos incorrectos
}
catch(NumberFormatException ex) {
return false;//Usuario no ha tecleado números
}
}
}
return true; //Todas las comprobaciones han sido correctas
}
}
Este código se puede probar online en
este enlace.
Pero no está completo, falta una última comprobación.
La hora de inicio que tenemos en partes[1] ha de ser anterior a la hora de fin que tenemos en partes[2]
Es decir, esta cadena es correcta:
martes,15:30,17:00Pero esta, no lo es:
martes,17:00,15:30Para comprobar esto, necesitamos nuevo método y podemos hacer que reciba los dos String donde tenemos las horas:
public static boolean comprobarTiempos(String inicio, String fin) {
}
Inicio y fin son horas con formato hh:mm
Y como ya dije anteriormente, una forma fácil de comprobar si una es anterior a la otra es transformar esos tiempos en segundos.
Así que de nuevo habría que hacer split(":") para separar las hh de las mm, tanto de inicio, como de fin
De nuevo hay que parsear a enteros, esta vez podemos ahorrarnos el try catch porque llegados a este punto de programa, ya hemos comprobado que las horas son caracteres numéricos.
Primero convertimos las hh de inicio a segundos, multiplicando por 3600.
Luego los mm, multiplicando por 60 y se los sumamos a los segundos que nos han dado las hh.
Ya tenemos los segundos de inicio. Ahora habría que hacer lo mismo para conseguir los segundos de fin.
Cuando tengamos ambas cantidades de segundos, las comparamos. Si los segundos de inicio son menores que los de fin, todo es correcto, devolvemos TRUE y ya por fin podemos decirle al usuario que la cadena introducida es VÁLIDA.
Si los segundos son iguales, o los de inicio son mayores que los de fin, entones retornamos FALSE y la cadena no es correcta, porque el tiempo de inicio no puede ser posterior al de fin.
Venga, último esfuerzo, ya casi lo tenemos