Ich komme hier mit einem Problem, das ich teilen möchte, ich hoffe, dass mir jemand helfen kann, das zu lösen. Ich werde versuchen, das Problem so klar wie möglich zu beschreiben. Das Problem ist wie folgt.
Ich habe ein Programm in Java, mit einer Methode, die eine Reihe von Daten empfängt (java.util.Date).
%Vor%Im obigen Beispiel haben wir drei Daten, wobei sich die ersten beiden überschneiden, aber Start-Datum3 ist nach End-Datum2. Für meine Geschäftsregel ist hier ein Zeitraum.
Betrachten Sie nun das nächste Szenario.
%Vor%In diesem Fall gilt, selbst wenn zwischen end-date2 und start-date3 ein Zeitraum liegt, dass kein Zeitbereich existiert, da die Zeit zwischen start-date4 und end-date4 diesen Bereich abdeckt .
Ich möchte true abrufen, wenn es einen oder mehrere Zeitbereiche gibt, sonst werde ich false zurückgeben.
Der einzige Weg, den ich ausprobiert habe, ist loop bei jeder Start / Ende-Beziehung, Vergleich von End-Date1 vs Start-Date2 vs Start-Date3 und so weiter ... das ist nicht das, was ich anwenden möchte.
Wenn es andere Ideen gibt, sind sie alle willkommen. Wenn Sie mehr Informationen benötigen, füge ich es hinzu. Danke.
Okay, das ist eine wirklich "komische" Idee, aber sehen Sie, ob dieses "Konzept" besser ist.
Grundsätzlich besteht die Idee darin, alle sich überschneidenden Daten in möglichst wenige "Bereiche" zusammenzufassen. Das bedeutet, dass Sie in Ihrem ersten Beispiel zwei verschiedene Bereiche (Startdatum 1 bis Enddatum 2 und ( Anfangsdatum 3 bis Enddatum 3) und in Ihrer Sekunde würden Sie mit einem enden (Anfangsdatum 1 bis Enddatum 4)
Wenn also die Menge nur einen bestimmten Bereich hat, dann haben Sie keine Lücken, sonst tun Sie das.
%Vor%Welche Ausgänge ...
%Vor%Wenn ich jetzt die Einstellung auf ... ändere
%Vor%es gibt aus ...
%Vor% Dies ist nur eine konzeptionelle Idee, und Sie sollten sich in Acht nehmen, dass dieses Beispiel die Daten in der dates
-Liste ändert, also sollten Sie sicher sein, dass Sie eine Kopie der Daten zuerst haben
Es gibt einen wirklich einfachen Algorithmus für dieses Problem.
Setzen Sie InRange auf 0. Jetzt scannen Sie beide Arrays in zusammengeführter Reihenfolge; Stellen Sie sicher, dass bei identischen Werten alle Endwerte vor den Startwerten mit demselben Wert ausgeführt werden. Für jeden Wert im Scan:
a. Wenn es aus dem Array der Endwerte stammt: Dekrementiere InRange . Wenn InRange jetzt 0 ist, haben Sie den Start eines "Zeitbereichs" gefunden.
b. Wenn es aus dem Array der Startwerte stammt: Wenn InRange 0 ist, haben Sie das Ende eines "Zeitraums" gefunden. Unabhängig davon, erhöhen Sie InRange .
Der obige Algorithmus ist für halboffene Intervalle ausgelegt, bei denen der Endwert tatsächlich nicht im Intervall enthalten ist. Im Falle von Daten sollten Sie so tun, als sei ein Startdatum tatsächlich die Mitternacht kurz vor dem Datum, während das Enddatum tatsächlich die Mitternacht unmittelbar danach ist (also das gleiche wie das Startdatum des nächsten Tages). Dies wirkt sich auf die Art und Weise aus, wie Sie die zusammengeführten Arrays der Reihe nach durchsuchen. Wenn in Ihrem Problem die Datumsbereiche inklusive sind, können Sie jedem Enddatum einfach 1 hinzufügen.
Um klar zu sein, in Ihrem zweiten Beispiel sind die beiden Arrays:
Und die Verarbeitungsreihenfolge in Schritt 3 lautet:
Sie müssen nicht wirklich zwei separate sortierte Arrays erstellen. Sie können alle Endpunkte (als Endpunkte) in einem einzelnen Array sortieren, wobei Sie jede Daten als Anfang oder Ende markieren. (Im Idealfall sollten Sie sicherstellen, dass X für X vor X steht. Andernfalls erzeugt der Algorithmus gelegentlich "Zeitspannen" von null Länge, die Sie ignorieren müssen.)