Algorithmus Problemchen...

Alex Großmann

Erfahrenes Mitglied
Hallo Ihr lieben,

ich hab (mal wieder x_X) ein Problem, ich kann einen Algorithmus nicht "elegant" umsetzen, und wollte euch mal um hilfe bitten.

Ich habe ein zwei Dimensionales Array aus Booleans. Die 1. Dimension dient quasi als Indexer für einen Tag (also 0 = Montag, 6 = Sonntag). Die 2. Dimension besteht aus 1440Minuten, was genau 24Stunden ist.

Nun lese ich aus einer Datenbank Termine aus. Die Zeiten sind in Dezimal angegeben. Dabei lese ich immer eine Sart und eine Endzeit aus.

Mein Ziel ist es, die freien Zeiten vor dem 1. Termin, zwischen den Terminen und nach dem letzten Termin eines Tages die freie Zeiten zu berechnen...

Dazu wollte ich das Array auf false, für die Zeit in der ein Termin statt findet, setzen. Das klappt auch:
Hier mal ein Schnipsel nur mit einem Tag...

Java:
while (erg3.next()) {
                    anfangszeit = erg3.getInt("anfangszeit");
                    laenge = erg3.getInt("laenge");
                    endzeit = erg3.getInt("endzeit");
                    wochentag = erg3.getString("wochentag");
                    System.out.println(anfangszeit + " - " + laenge + " - " + wochentag);
                    //Die Daten werden nun nach ihrem Tag sortiert in das Array geschrieben. Überall wo quasi ein Termin ist, wird ein false eingefügt!
                    if ("Montag".equals(erg3.getString("wochentag"))) {
                        for (int i = anfangszeit; i < endzeit; i++) {
                            freeTimes[0][i] = false;
                        }
                    } }

Angenommen in der Datenbank steht folgendes:
WochentagTermin vonTermin bis
Montag100300
Montag8001000

Dann sollten folgende freie Termine da sein:
WochentagFrei vonFrei bis
Montag0300
Montag300800
Montag10001440

Bisher wollte ich mit 2 for-schleifen über das Array gehen, ich glaube der Ansatz stimmt, aber die Ausgaben nicht...ich finde meinen Denkfehler nicht :(

Hier noch mein aktueller Algorithmus:
Java:
boolean erstesFrei = true, erstesBelegt = false;
                int anfang = 0, ende = 0, l = 0;

                for (int d = 0; d < 7; d++) {
                    for (int t = 0; t < 1440; t++) {
                        if (freeTimes[d][t] == true) {                          //Wenn kein Termin eingetragen ist - also frei ist
                            if (erstesFrei == true) {                           //erstes Frei merken 
                                anfang = t;
                                erstesFrei = false;                                
                            }
                            ende++;                                             //muss in jedem Fall hochgezählt werden 
                        } else if (freeTimes[d][t] == false) {                  //geht rein wenn der 1. Termin (also dessen Anfang) gefunden wurde
                            if(erstesBelegt == true){
                                
                            }
                            erstesFrei = true;
                            l = ende - anfang;
                            
                            Statement st4 = cn.createStatement();
                            //Für jeden Loop einen Datenbank eintrag erstellen
                            st4.execute("INSERT INTO termin(anfangszeit, laenge, endzeit, wochentag) VALUES ('" + anfang + "','" + l + "','" + ende + "','" + return_Wochentag(d) + "');");
                            Statement st5 = cn.createStatement();
                            ResultSet erg4 = st5.executeQuery("SELECT * FROM termin ORDER BY IDTermin DESC LIMIT 1;");
                            st4.execute("INSERT INTO veranstaltungstermin(IDSaalFK, IDTerminFK, GGUIDFK) VALUES "
                                    + "('" + IDSaal + "',"
                                    + "'" + erg4.getString("IDTermin")
                                    + "','frei');");
                        }
                    }
                    anfang = 0;
                }

ich bin für jede Hilfe dankbar!
 
Zuletzt bearbeitet:
Hallo,

- Bitte verwende Java-Tags anstatt Code-Tags. Das Erhöht die Lesbarkeit und damit die Chance, dass dir geholfen wird.
- Ich habe mich erinnert, dass wir vor Kurzem ein ähnliches Thema hatten und musste gerade feststellen, dass dies ebenfalls von dir war: http://www.tutorials.de/java/395025-denkproblem-freie-zeitraeume.html Besteht hier eine Verbindung? Wenn ja, wie kommts, dass hier auf einmal ganz anders herangegangen wird?
- Wie ist die Performance von deinem Programm?
 
Erledigt mit den Java TAGS, danke!

Also es ist quasi eine Abwandlung zum alten Projekt, jedoch wurde vieles anders gemacht. Eben auch eine SQLite Datenbank implementiert. Die Performance ist gut und ich hänge nur noch diesem Problem da oben...
Den Algorithmus von ComicFreak habe ich benutzt damals, er passt jedoch nicht zu diesem Problem, da man durch das Array an sich keine Start und Endzeiten berücksichtigen muss, auch bleibt ein Split etc. aus... hmmh ich habe schon versucht den alten Algorithmus von ComicFreak anzupassen, aber es passt wirklich nicht...

Ich hoffe ihr könnt mir nochmal helfen...
 
Hallo,

also ich sehe jetzt nur, dass du deine Variable erstesBelegt am Anfang auf false setzt, diese aber niemals auf true gesetzt wird, obwohl du explizit in der If-Verzweigung darauf prüfst. Eventuell hast du da etwas aus den Augen verloren.

Ansonsten kann ich jetzt nichts erkennen, hab aber auch nur mal grob drüber geschaut ;)
 
Den Algorithmus von ComicFreak
Ursprünglich war ja "Com" als Abkürzung für "Computer" gedacht, aber mittlerweile bin ich ja laut dir auch ein Comic-Fan :D

Im Prinzip ist das das gleiche Problem wie im alten Thread. Nur dass du nun die Minuten in der DB speicherst. Wenn du die Minuten in eine Stunden:Minuten-Angabe umwandelst, könntest du sogar meinen alten Code nutzen. Soweit ich mich erinnern kann, habe ich dir den letzten Code per PN gesendet. Dieser müsste der aktuellste sein.
 
Sorry ComFreek <.< :D Mir war wie ComicFreak xD
Wie auch immer, ich habe das Problem gelöst, der Algorithmus musste nur bissl abgeändert werden...danke für eure Bemühungen :)
 
Zuletzt bearbeitet:
Zurück