Ho una classe Task simile alla seguente (utilizzando Java 8 Time API).Combinazione di intervalli di date sovrapposti - Java
class Task {
LocalDateTime start;
LocalDateTime end;
Set<String> actionItems;
}
Ho due ordinato (la prima volta da inizio, quindi entro la fine) gli elenchi contenenti tali casi Task, consente di dire List<Task> tasksList1
e List<Task> tasksList2
. Voglio combinare attività sovrapposte (interrompendo le attività se necessario e aggiungendo actionItem da altre attività che si sovrappongono in un singolo oggetto task).
Ad esempio, supponiamo di avere un'attività denominata T1 che inizia il 01/01/2015 e termina il 31/01/2015, che contiene gli elementi di azione A e B. Quindi un utente crea un nuovo Task T2 che inizia 15/01/2015 e termina il 15/02/2015 e aggiunge l'elemento di azione C al suo interno. Quando combino, dovrei ottenere tre oggetti Task come segue.
- Task X - da 01/01/2015 a 2015/01/15, contiene elementi di azione A, B
- Task Y - dal 2015/01/15 al 2015/01/31, contiene articoli A , B e C
- Task Z - dal 2015/01/31 al 2015/02/15, contiene voce C
per visualizzare, se il mio oggetto compito dalle due liste simile al seguente in una timeline :
> [-----] [-----] [----] [-----------------]
> [-----] [---------------] [------]
Quindi l'elenco delle attività risultante conterrà le attività come segue.
> [--][-][--] [-----] [-----][----][--] [-][------][-----]`
compiti sovrapposti dovrebbero avere le actionItems combinati da entrambi i compiti che si sovrappongono per il periodo in cui si sovrappongono.
Qual è il modo più efficiente per gestirlo? Al momento sto provando diverse opzioni con un PeekableIterator, ma ancora nessuna fortuna. Anche le soluzioni che utilizzano JodaTime anziché le API Java 8 sono benvenute.
Thank You Tagir! Scalata :) Mi spiace non essere stato chiaro nella mia domanda che anche il tempo è importante per me. Per semplicità nell'esempio l'ho lasciato fuori. Credo che la soluzione dovrebbe funzionare anche per LocalDateTime? Un'altra cosa da notare è che l'output dell'algoritmo è leggermente diverso da quello che mi aspetto.Come ascolto in tre punti elenco, mi aspetto tre output come output, prima dal 01/01 al 01/15 con A, B, secondo dal 01/15 al 01/31 con A, B, C e terzo dal 01/31 a 02/15 con C. Nell'output non ci saranno sovrapposizioni. Sto cercando di modificare la tua soluzione per gestire quella ... –
@YohanLiyanage, sì, per 'LocalDateTime' funzionerà allo stesso modo, basta sostituire il nome della classe ovunque. Nell'esempio di esempio ho aggiunto un compito non sovrapposto (dell'anno 2014) solo per verificare se è gestito correttamente. Rimuovilo e l'output sarà lo stesso. –
Oh mi sono perso che era il 2014 :). Grazie ancora, e questo funziona come un fascino –