C # Logic - lacune e isole

1

Sto cercando aiuto per la visualizzazione degli orari disponibili per gli appuntamenti (ad esempio un libro degli appuntamenti per parrucchieri).

Attualmente ho una query che restituisce un insieme di periodi che non sono disponibili per gli appuntamenti (se esiste un appuntamento esistente o se il fornitore di servizi è chiuso).

Quindi diciamo che il 3 febbraio, dal 12 al 5 non è disponibile, voglio produrre la seguente stringa: 1 gennaio 12 febbraio - 3 febbraio 12:00 3 febbraio, 17:00 - 31 dicembre 12 ore.

Il mio intero intervallo è di 1 anno dal 1 ° gennaio al 31 dicembre e ci possono essere tante date non disponibili.

    
posta Luca 27.08.2013 - 22:24
fonte

2 risposte

1

Se la sovrapposizione non è consentita , è possibile seguire un processo piuttosto semplice:

  • Aggiungi un appuntamento a partire da 31 Dec 12 AM (che termina in qualsiasi momento).

  • Ordina gli appuntamenti.

  • Inizializza lastTime in 1 Jan 12 AM .

  • Per ogni appuntamento:
    Output lastTime all'inizio di questo appuntamento.
    Imposta lastTime = la fine di questo appuntamento.

Se è consentita la sovrapposizione, ciò richiede un algoritmo di sweep-line :

  • Dividi gli appuntamenti in ore di inizio e di fine e li ordina.
    Se un'ora di inizio e un'ora di fine sono uguali, imposta prima l'ora di inizio (altrimenti potresti ottenere 0 uscite di durata).

  • Aggiungi 31 Dec 12 AM come ora di inizio.

  • Inizializza lastTime in 1 Jan 12 AM .

  • Inizializza una variabile count a 0. Questa variabile indicherà, in qualsiasi momento, quanti appuntamenti sono occupati al momento attuale.

  • Fai scorrere i tempi.

    Se incontriamo un'ora di inizio:

    • Se count = 0, restituisci lastTime a questa ora.

    • Incremento count .

    Se incontriamo un orario di fine:

    • Riduci count .

    • Imposta lastTime in questo momento.

Se gli appuntamenti possono andare oltre l'intervallo specificato , dovrebbe essere abbastanza semplice da gestire:

Per il primo algoritmo, inizia dal primo appuntamento che termina dopo 1 Jan 12 AM e termina prima di qualsiasi appuntamento dopo 31 Dec 12 AM .

Per il secondo, inizializza count al numero di appuntamenti che passa attraverso 1 Jan 12 AM e ignora i punti al di fuori dell'intervallo specificato.

    
risposta data 29.08.2013 - 13:43
fonte
0

Dato il punto di partenza, la soluzione è abbastanza semplice. Supponiamo che tu parta dal momento in cui tutti i tempi sono disponibili, quindi la visualizzazione iniziale sarà:

1 gennaio 12:00 - 31 dicembre 23:59

Supponendo che gli orari degli appuntamenti siano in ordine cronologico e non vi sia alcuna sovrapposizione con nessuno di essi (in caso contrario, dovresti essere in grado di creare un algoritmo per correggere l'elenco per te) la soluzione è semplice.

Per ogni slot "non disponibile":

  • Prendi l'ultimo slot disponibile e dividerlo in due
  • imposta l'ora di inizio del primo slot all'orario di inizio dell'originale
  • imposta l'ora di fine del primo slot sull'ora di inizio dello slot "non disponibile"
  • imposta l'ora di inizio del secondo slot sull'ora di fine dello slot "non disponibile"
  • imposta l'ora di fine del secondo slot sull'ora di fine dell'originale.

Quando avrai finito, avrai una lista di slot disponibili. Ecco un esempio:

La disponibilità originale è 1 gennaio 12:00 - 31 dicembre 23:59

hai i seguenti spazi "non disponibili"

15 gennaio 12:00 - 15 gennaio 23:59

20 gennaio 12:00 - 4 febbraio 9:00

14 febbraio 13:00 - 14 febbraio 17:00

La prima esecuzione dell'algoritmo sarà simile a

Originale 1 gen. 12:00 - 31 dicembre 23:59

Dividi in due

Prime esecuzioni Inizio dell'originale all'inizio di "non disponibile"

1 gen. 12:00 - 15 gennaio 12:00

Seconde esecuzioni Fine di "non disponibile" alla fine dell'originale

15 gennaio 23:59 - 31 dicembre 23:59

Quindi ora hai due slot disponibili

1 gen. 12:00 - 15 gennaio 12:00

15 gennaio 23:59 - 31 dicembre 23:59

Fai le stesse operazioni con i prossimi due e sei a casa libera.

Non dimenticare i casi limite.

Cosa succede quando hai uno spazio disponibile di lunghezza zero essenziale? Cosa succede quando uno degli "slot non disponibili viene eseguito oltre la fine o prima dell'inizio della finestra?

    
risposta data 29.08.2013 - 18:45
fonte

Leggi altre domande sui tag