2011-07-09 9 views
6

Estoy escribiendo una aplicación web que permite a los usuarios inscribirse en cursos universitarios. Los cursos pueden impartirse en determinados intervalos de tiempo; un intervalo de tiempo es un día (en una semana, es decir, domingo, lunes, etc.) y una hora. Hay espacios de tiempo fijos en los que se pueden impartir cursos. Mi pregunta es: ¿cuál es la mejor manera de implementar estos espacios de tiempo?Cómo representar los intervalos de tiempo en un horario

Un pensamiento que tuve fue el uso de una enumeración, pero luego hay 70 espacios de tiempo. Así que pensé en tener dos enumeraciones, una para el día de la semana (aunque apuesto a que ya existe en algún lugar, ¿sabes dónde puedo encontrar una enumeración existente de este tipo?) Y otra para las horas permitidas (por ejemplo, 8:00). , 9:00, 10:00, etc.) y tienen una clase Timeslot que contiene ambos.

Sin embargo, creo que debe haber una solución más elegante en la que no haya pensado, ¿qué opinas?

+0

Hola @Amir! Estos intervalos de tiempo también contienen la duración? ¿Por qué quieres instanciarlos a todos? – nick2083

+1

Solo quiero que todas las personas recuerden que no todos los días tienen 24 horas que realmente deberían tenerse en cuenta para cada solución. Personalmente, solo crearía una clase de ranura de tiempo que almacena el desplazamiento desde el lunes 00:00 (y si no todas las ranuras de tiempo tienen que ser de igual longitud y un rango final exclusivo), parece el más simple para trabajar.Para el resultado, podemos (fácilmente no es fácil, pero Jodatime debe cumplir con esa tarea) calcular el día/la hora correctos. – Voo

+1

No todo tiene que depender de JodaTime, parece ser la respuesta a todos estos días. Además, parece que el no todos los días tiene 24 horas de restricción realmente no se aplica aquí. Especialmente porque nunca he visto una clase en todos mis estudios universitarios que duró más de 5 horas (muy por debajo del ciclo de día completo) – Woot4Moo

Respuesta

0

personalmente creo que una sola enumeración es una solución perfecta, aunque estoy de acuerdo que es un poco feo en este caso.

probable es que me implementar una clase con esta interfaz:

class ScheduledTime { 
    int time; 
    HashMap days<int, string>; 

    Time(String day, int hour) //Inits the "time" variable with this formula: day*10 + hour - someNum. 
    (someNum so that hour - someNum is 0) 
    boolean compareTo()/equals(); (just compare time) 
    String getDay()// Divide by 10 to get a number from 0 to 6, then just convert to sunday-monday. 
    int getTime() //Mod by 10 and then add someNum. 
} 

Uso del HashMap convertir de nums día (0 a 6) a cadenas y viceversa. Crear una instancia durante el constructor.

-1

le sugeriría para crear enumeraciones: 3 días (domingo, lunes, etc.); horas (0, 1, 2, ..., 23), minutos (0, 1, 60);

A continuación, cree la clase TimeEdge que contiene día, hora, minutos. A continuación, cree el intervalo de tiempo de la clase que corresponde a los miembros de tipo TimeEdge: inicio y fin.

+0

días ya existe – Woot4Moo

0

La clase Calendar (Java API reference) tiene constantes para los días de la semana.

La mejor forma de representar los intervalos de tiempo depende de cómo desee que estos datos interactúen con el resto de su aplicación. Personalmente, crearía un objeto que representa un intervalo de tiempo del curso, y tomaría una matriz int de días disponibles y un int para la hora de inicio, un int para el minuto de inicio (si es necesario), un int para la hora final y un int para el minuto final (si es necesario) en el constructor. El objeto contendría una lista de objetos de calendario que refleja los tiempos de inicio y fin del intervalo de tiempo del curso para cada día que el curso se reuniría. Algo así como:

public Class TimeSlot { 
    private Calendar[] coursesStart; 
    private Calenddar[] coursesEnd; 

    public TimeSlot(int[] daysMeeting, int startHour, int startMinute, int endHour, int endMinute) { 
     coursesStart = new Calendar[daysMeeting.length]; 
     coursesEnd = new Calendar[daysMeeting.length]; 

     for (int ctr = 0; ctr < daysMeeting.length; ctr++) { 
      int courseDay = daysMeeting[ctr]; 

      Calendar start = new Calendar(); 
      start.set(Calendar.DAY_OF_WEEK, courseDay); 
      start.set(Calendar.HOUR, startHour); 
      start.set(Calendar.MINUTE, startMinute); 

      coursesStart[ctr] = start; 


      Calendar end = new Calendar(); 
      end.set(Calendar.DAY_OF_WEEK, courseDay); 
      end.set(Calendar.HOUR, endHour); 
      end.set(Calendar.MINUTE, endMinute); 

      coursesEnd[ctr] = end; 
     } 
    } 
} 
0

Para la primera parte de la clase Calendar Java es lo que se desea utilizar, en términos de días de la semana. No veo que esto cambie pronto. Ahora para la segunda parte donde el TimeSlot también tiene un campo de hora, creamos algo en esta línea.

class TimeSlot 
{ 
    Calendar classStart; //Holds the day and the hour for the start 
    Calendar classEnd; //Holds the day and the hour for the end 

    public TimeSlot(Calendar classStart, Calendar classEnd) 
    { 
    this.classStart = classStart;  
    this.classEnd = classEnd; 
    } 

    public TimeSlot(Calendar classStart, int lengthOfClassInMinutes) 
    { 
    this.classStart = classStart; 
    this.classEnd = classStart; 
    classEnd.add(Calendar.MINUTE, lengthOfClassInMinutes); 
    } 

Ahora para mostrar cómo esto encaja en el gran esquema de las cosas que tendríamos una clase que representa clases.

public class Class 
{ 
    String title; 
    Instructor instructor; 
    int sizeOfClass; 
    //rest of implementation 
} 

Luego una clase para representar una clase programada en el sistema.

public class ScheduledClass 
{ 
    Class classToSchedule; 
    TimeSlot classTimeSlot; 

    public ScheduledClass(Class classToSchedule, TimeSlot classTimeSlot) 
    { 
    this.classToSchedule=classToSchedule; 
    this.classTimeSlot=classTimeSlot; 
    } 
} 

En el anterior Fui en contra de extender la clase de objeto, ya que parecería que ScheduledClass podría hacerse más genérico y por lo tanto debe confiar en la composición.

+0

Teniendo en cuenta todos los problemas y la no facilidad de uso de Calendar, recomendaría seriamente el uso de JodaTime. ¿El calendario incluso maneja el horario de verano, es decir, 1:00 +2 horas no necesariamente son 3:00? – Voo

0

java.tiempo

Está utilizando clases heredadas viejas problemáticas que ahora han sido suplantados por las clases java.time.

DayOfWeek

La clase java.time.DayOfWeek es una enumeración que ya define siete objetos, uno para cada día de la semana. Están numerados en el orden estándar ISO 8601, 1-7 para lunes a domingo.

Hacer WeekTimeSlot clase

Parece que desea representar la idea genérica de un día de la semana y hora del día. No está capturando momentos específicos en la línea de tiempo. Por lo tanto, solo necesita una clase LocalTime para iniciar & veces de parada. Esta clase carece de una fecha y carece de una zona horaria.

Sugiero definir una clase con al menos tres miembros:

También puede hacer un seguimiento de el período de tiempo para cada ranura en lugar de calcular varias veces en tiempo de ejecución.

enumeraciones son para un número limitado de objetos cuyos valores son conocidos en tiempo de compilación. Espero que sus valores varíen en el tiempo de ejecución para diferentes semestres/trimestres. Entonces no es apropiado para enums.

EnumMap

Si desea agrupar las ranuras de día de la semana, use un EnumMap. Esta implementación de Map está optimizada para usarse cuando los valores clave son objetos enum. Debería asignar el objeto DayOfWeek a List<WeekTimeSlot>.

Esta aplicación Map toma muy poca memoria y corre muy rápido.

Momento sobre el calendario

Si es necesario aplicar estas ranuras para un momento particular en un día particular en la línea de tiempo real, utilice el LocalTime junto con una LocalDate y una ZoneId para obtener una ZonedDateTime.

Puede encontrar útil la clase Interval del proyecto ThreeTen-Extra, una extensión de las clases java.time. Esta clase representa un lapso de tiempo entre un par de momentos en la línea de tiempo.

Cuestiones relacionadas