Ich habe eine Task-Klasse, die wie folgt aussieht (mit Java 8 Time API).Überlappende Datumsbereiche kombinieren - Java
class Task {
LocalDateTime start;
LocalDateTime end;
Set<String> actionItems;
}
Ich habe zwei sortiert (zuerst von Anfang an, dann bis Ende) Listen solchen Aufgabe Instanzen enthalten, können List<Task> tasksList1
und List<Task> tasksList2
sagen. Ich möchte überlappende Aufgaben kombinieren (indem Sie die Aufgaben bei Bedarf auflösen und actionItems aus anderen Aufgaben hinzufügen, die sich in ein einzelnes neues Aufgabenobjekt überschneiden).
Angenommen, ich habe eine Aufgabe namens T1, die am 01.01.2015 beginnt und am 31.01.2015 endet und die Aktionselemente A und B enthält. Dann erstellt ein Benutzer eine neue Aufgabe T2, die am beginnt 15.01.2015 und endet am 15.02.2015 und fügt den Aktionspunkt C hinzu. Wenn ich kombiniere, sollte ich drei Task-Objekte wie folgt erhalten.
- Task X - aus 01.01.2015 bis 2015.01.15, enthält Elemente Aktion A, B
- Task-Y - aus 2015.01.15 bis 2015.01.31 enthält einen Artikel , B und C
- Aufgabe Z - von 2015.01.31 bis 2015.02.15, enthalten Artikel C
sichtbar zu machen, wenn meine Aufgabe Objekt aus den beiden Listen wie folgt in einer Timeline aussehen :
> [-----] [-----] [----] [-----------------]
> [-----] [---------------] [------]
Dann würde die resultierende Aufgabenliste Aufgaben wie folgt enthalten.
> [--][-][--] [-----] [-----][----][--] [-][------][-----]`
Overlapping Aufgaben sollten die actionItems von beiden der Aufgaben kombiniert haben, die für den Zeitraum überlappen, in dem sie sich überlappen.
Was ist der effizienteste Weg, damit umzugehen? Im Moment probiere ich verschiedene Möglichkeiten mit einem PeekableIterator aus, aber noch kein Glück. Jede Lösung, die JodaTime anstelle von Java 8 APIs verwendet, ist ebenfalls willkommen.
Danke Tagir! Sie rocken :) Sorry, ich war nicht klar in meiner Frage, dass die Zeit auch für mich wichtig ist. Zur Vereinfachung habe ich das im Beispiel weggelassen. Ich glaube, die Lösung sollte auch für LocalDateTime funktionieren? Noch etwas ist zu beachten, dass die Ausgabe von Ihrem Algorithmus etwas anders ist als ich es erwarte.Wie in drei Aufzählungszeichen zu hören, erwarte ich drei Aufgaben als Ausgabe, zuerst von 01/01 bis 01/15 mit A, B, Sekunde von 01/15 bis 01/31 mit A, B, C und Drittel von 01/31 bis 02/15 mit C. In der Ausgabe wird es keine Überschneidungen geben. Ich versuche, Ihre Lösung so zu ändern, dass ... –
@YohanLiyanage, ja, für 'LocalDateTime' wird es auf die gleiche Weise funktionieren, ersetzen Sie einfach den Klassennamen überall. Ich fügte im Verwendungsbeispiel eine nicht überlappende Aufgabe (des Jahres 2014) hinzu, nur um zu testen, ob sie korrekt gehandhabt wird. Entfernen Sie es, und die Ausgabe wird gleich sein. –
Oh, ich habe verpasst, dass es 2014 war :). Nochmals vielen Dank, und das funktioniert wie ein Zauber –