Überlappende Datumsbereiche kombinieren - Java

8

Ich habe eine Task-Klasse, die wie folgt aussieht (mit Java 8 Time API).

%Vor%

Ich habe zwei Listen (sortiert nach dem Start, dann nach dem Ende) mit solchen Instanzen, sagen wir List<Task> tasksList1 und List<Task> tasksList2 . 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 01 beginnt / 15/2015 und endet am 15.02.2015 und fügt den Aktionspunkt C hinzu. Wenn ich es kombiniere, sollte ich drei Task-Objekte wie folgt erhalten.

  • Aufgabe X - vom 01.01.2015 bis zum 15.01.2015 enthält die Aktionselemente A, B
  • Aufgabe Y - vom 15.01.2015 bis 31.01.2015, enthält die Punkte A, B und C
  • Aufgabe Z - vom 31.01.2015 bis 15.02.2015, enthält Punkt C

Um zu visualisieren, ob mein Aufgabenobjekt aus den beiden Listen in einer Zeitleiste wie folgt aussieht:

%Vor%

Dann würde die resultierende Aufgabenliste Aufgaben wie folgt enthalten.

%Vor%

Überlappende Aufgaben sollten die actionItems aus beiden Aufgaben zusammenführen, die sich für den Zeitraum überschneiden, in dem sie sich überschneiden.

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.

    
Yohan Liyanage 25.08.2015, 05:59
quelle

1 Antwort

10

Erstens, wenn du nur an Daten interessiert bist (es interessiert dich nicht an Zeiten), ist es besser, stattdessen LocalDate zu verwenden. Zweitens nehme ich an, dass Sie einen Aufgabenkonstruktor haben. Also habe ich das folgende Task -Objekt verwendet:

%Vor%

Hier ist die Lösung einer allgemeineren Aufgabe, die alle Aufgaben in der gegebenen Sammlung nur nach Ihren Regeln zusammenführt (die Eingabesammlung ist nicht unbedingt sortiert):

%Vor%

Das Kernstück ist der NavigableMap , wobei jeder Schlüssel der Beginn des nächsten Zeitraums ist und der Wert die Sammlung von Aktionen für den Zeitraum vom gegebenen Start bis zum nächsten Schlüssel ist (leere Werte entsprechen den Zeiträumen ohne Aktionen) . Nach dem Hinzufügen der neuen Aufgabe werden vorhandene Einträge entsprechend aktualisiert. Anwendungsbeispiel:

%Vor%

Ausgabe:

%Vor%     
Tagir Valeev 25.08.2015, 07:00
quelle