Terminüberschneidungen ermittlen

F

Faabian

Gast
Hallo,

ich habe folgendes Problem:

Ich habe 2 oder mehr Array Listen welche jeweils Objekte vom Typ "Termin" beinhalten.
Ein Termin beinhaltet jeweils ein Calendar Element für den Begin und eines für das Ende des jeweiligen Termins.

Nun möchte ich alle Listen miteinander "synchronisieren". D.h. ich erstelle eine neue Liste "alleTermine" in welcher wie der Name schon sagt der Gesamtbestand der Termine gespeichert wird.

Allerdings möchte ich vorher herausfinden welche Termine sich innerhalb der verschiedenen Termin Listen zeitlich überschneiden.

Wenn also ein Termin aus Liste A und ein Termin aus Liste B sich zeitlich überschneiden, soll in beiden Terminen ein Error-Flag auf true gesetzt werden. Danach werden sie beide in die GesamtListe übernommen.

Mein größtes Problem ist hierbei die zeitlichen Überschneidungen zu ermitteln.

Angenommen ich habe:

Liste A
Liste B
Liste C

muss ich dann jeden mit jedem Termin der anderen Listen vergleichen oder wie würdet ihr das machen?

Danke für eure Hilfe, ich bin wirklich für jeden Tipp dankbar! =)


Gruß Fabian
 
S

SlaterB

Gast
alle miteinander vergleichen ist einfach (vom Handling der Listen A, B, C abgesehen) und führt zum Ziel,

etwas Unterstützung erhälst du, wenn du doch erst alle in eine Liste einfügst und auch zeitlich sortierst, etwa nach Anfangszeit,
dann müsstest du nur diese Liste durchlaufen,
zu jedem Termin X nur die nachfolgenden Termine der Liste durchlaufen (in innerer Schleife), und auch nicht bis zum Ende,
sondern nur bis ein Starttermin hinter dem Ende von X liegt,

damit würde also etwas an Kombinationen eingespart, bei Millionen Terminen kann das den Unterschied zwischen Jahren oder Sekunden an Berechnungszeit ausmachen,
im kleinen Maßstab aber wie gesagt nicht so wichtig
 
F

Faabian

Gast
Hey SlaterB,

vielen Dank für deine schnelle Hilfe, mit Hilfe deiner Ideen konnte ich nun folgenden funktionierenden Code entwickeln:

Code:
	// Den Gesamtbestand der Termine des Benutzers nach dem
			// Beginn der Termine sortieren:
			TerminSort comp = new TerminSort();
			Collections.sort(alleDevicesTermine, comp);

			// Überschneidungen der Termine ermitteln:

			// Durchlaufe alle Termine:
			for (int i = 0; i < alleDevicesTermine.size(); i++) {
				// Durchlaufe alle Termine die nach dem aktuellen Termin
				// gespeichert sind:
				for (int k = i + 1; k < alleDevicesTermine.size(); k++) {
					// Liegt der Beginn des nachfolgenden Termins nach dem Ende
					// des aktuellen Termins --> Keine Überschneidung --> next
					if (alleDevicesTermine.get(k).getBegin()
							.after(alleDevicesTermine.get(i).getEnd())) {
						break;
					}

					// Überschneidet sich der nachfolgende Termin mit dem
					// aktuellen Termin?:
					// (Endet der aktuelle Termin nachdem der nachfolgende
					// Termin begonnen hat?:)
					if (alleDevicesTermine.get(i).getEnd()
							.after(alleDevicesTermine.get(k).getBegin())) {
						// Setze das Error Flag der beiden Termine bei
						// gefundener Überschneidung auf true:
						alleDevicesTermine.get(i).setError(true);
						alleDevicesTermine.get(k).setError(true);
						
						System.out.println("ErrorFlag1: " + alleDevicesTermine.get(i).getTopic());
						System.out.println("ErrorFlag2: " + alleDevicesTermine.get(k).getTopic());

					}
				}
			}


danke =)
 
S

SlaterB

Gast
Tipp: lokale Variablen erstellen, eine kurze Variable[c] terminK[/c] statt ständig [c]alleDevicesTermine.get(k)[/c] schreiben
 

Oben