Vector in Gruppen sortieren.



  • Hey,
    ich brauche Hilfe beim Sortieren eines Vektors.
    Ich habe eine Programm geschrieben, dass mir automatisch 90 Minuten lange Termine generiert. Diese speichert er in einem Vector ab.
    So besteht z.B. der Termin 10:20 - 11:50 aus 4 Elementen des Vectors, die alle aufeinanderfolgen.
    Wenn ich nun mehrere Termine habe, die random erzeugt werden, bekomme ich Listen wie z.B. :

    09:18 - 10:48
    07:24 - 08:54
    12:21 - 13:51
    18:05 - 19:35
    14:13 - 15:43
    19:19 - 20:49
    04:24 - 05:54
    14:16 - 15:46
    22:11 - 23:41
    11:08 - 12:38

    Wenn ich diese mit dem normalem sort(begin,end) sortiere, ändert sich natürlich die Reihenfolge auch innerhalb der Termine. Dies führt dann dazu:

    04:05 - 05:07
    08:08 - 09:10
    11:11 - 12:12
    13:13 - 14:14
    15:15 - 16:18
    18:19 - 19:19
    20:21 - 22:23
    24:24 - 35:38
    41:43 - 46:48
    49:51 - 54:54

    Dies ist natürlich nicht mein Ziel.
    Wie kann ich es schaffen, dass ich den Vector in "4er Gruppen" sortiert bekomme, sodass die Termine an sich nicht verändert werden?



  • @mute7 sagte in Vector in Gruppen sortieren.:

    So besteht z.B. der Termin 10:20 - 11:50 aus 4 Elementen des Vectors, die alle aufeinanderfolgen.

    Verstehe ich nicht. Warum ist ein Termin nicht ein Element?



  • Da ist recht neu in dem ganzen Thema bin und ich nicht weiß, wie man eine Zahl wie 10:30 in einem Element speichern soll. Als double 10.30? Als string "10:30"? Dann muss ich die ja auch noch irgendwie splitten, um damit zu rechnen, auch das weiß ich nicht wie das geht. Also hab ich es so wie beschrieben gemacht.



  • Deine Beschreibung ist aber unvollständig. Wie hast du es denn nun gemacht? Wie kommst du auf 4 Elemente? Das ist mir völlig unklar.

    Ein Termin sieht doch intuitiv erstmal so aus:

    struct Termin {
      std::string start; // oder eben ein Zeit-Datentyp wie std::chrono::time_point 
      std::string end;
    };
    

    Also doch erstmal egal, ob die Startzeit als String oder echter Zeitstempel drin ist.

    Und dann hast du einen vector:

    std::vector<Termin> termine;
    
    // sortieren nach Startzeit:
    std::sort(begin(termine), end(termine), 
              [](const Termin &a, const Termin &b){ return a.start < b.start; }
    );
    

    Wenn du mit den Uhrzeiten rechnen willst, dann empfiehlt sich die Chrono-Bibliothek. Sie ist aber etwas schwieriger zu benutzen, daher habe ich hier erstmal std::string verwendet, denn das Sortierproblem ist von der Wahl des Datentyps für die Uhrzeit erstmal unabhängig.



  • Ich verstehe nicht, wie ich mit einem String wie "10:30 - 12:00" rechnen kann.
    Ich lasse 4 verschiedene Nummern generieren, wobei die Stunden nur von 0-24 und die Minuten von 0-60 gehen.
    Die speichere ich dann nacheinander in einem Vector ab.
    Hier ist mein kompletter Code, falls das dann verständlicher ist (Ich bin neu in C++, hoffe der Code ist halbwegs verständlich) :

    #include <iostream>
    #include <iomanip>
    #include <vector>
    #include <stdlib.h>
    #include <ctime>
    #include <algorithm>
    
    using namespace std;
    
    class Meetingschedule
    {
    protected:
        //...
    
    public:
        //...
    };
    
    class Time : public Meetingschedule
    {
    private:
        int fHour,fMinute,uHour,uMinute;    //from - until 
        vector<double> schedule;
    
    public:
        Time();
        Time(int numberOfMeetings){
            addAutoMeetings(numberOfMeetings);
            showMeeting();
        }
        Time(int fromHour, int fromMinute, int untilHour, int untilMinute)
        {
            cout << endl << endl;
            cout << "Your Meeting has successfully been added to your schedule."<< endl;
            addMeeting(fromHour, fromMinute, untilHour, untilMinute);
            while(askForMeeting() == true){}
            showMeeting();
        }
        bool askForMeeting()
        {
            string goOn;
            cout << endl;
            cout << "Do you want to add another meeting?" << endl;
            cout << "Press [y] or [n]";
            cin >>goOn;
            if (goOn == "y"){
                addMeeting();
                return true;
            }
            else{
                return false;
            }
        }
        bool checkNumbers(int fromHour, int fromMinute, int untilHour, int untilMinute){
            if(fromHour < 0|| untilHour < 0 ||fromHour >= 24 || untilHour >= 24){
                cout << "Error: Check your Hours!" << endl;
                return false;
            }
            if(fromMinute <0 || untilMinute < 0 || fromMinute >= 60 || untilMinute >= 60){
                cout << "Error: Check your Minutes" << endl;
                return false;
            }
            if(fromHour > untilHour ){
                cout << "Error: The first time has to be earlier than the second time! "<< endl;
                return false;
            }
            if(fromHour == untilHour && fromMinute >= untilMinute){
                cout << "Error: The first time has to be earlier than the second time! "<< endl;
                return false;
            }
    
            else{
                return true;
            }
        }
        bool checkNumbersWithoutCommands(int fromHour, int fromMinute, int untilHour, int untilMinute){
            if(fromHour < 0|| untilHour < 0 ||fromHour >= 24 || untilHour >= 24){
                return false;
            }
            if(fromMinute <0 || untilMinute < 0 || fromMinute >= 60 || untilMinute >= 60){
                return false;
            }
            if(fromHour > untilHour ){
                return false;
            }
            if(fromHour == untilHour && fromMinute >= untilMinute){
                return false;
            }
            else{
                return true;
            }
        }
        void showMeeting()
        {
            cout << endl;
            cout << "Your Schedule(Before Sorting): "<< endl;
            cout << endl;
            for (int i = 0; i < schedule.size(); i++)
            {
                cout <<setw(2)<<setfill('0')<< schedule[i];
                if (i % 4 == 3)
                {
                    cout << endl;
                }
                else if(i % 2 == 1)
                {
                    cout << " - ";
                }
                if(i%2 == 0){
                    cout <<":" ;
                }
            }
            
            cout << endl;
            cout << endl;
            cout << "Your Schedule(After Sorting): "<< endl;
            sort(schedule.begin(),schedule.end());
            for (int i = 0; i < schedule.size(); i++)
            {
                cout <<setw(2)<<setfill('0')<< schedule[i];
                if (i % 4 == 3)
                {
                    cout << endl;
                }
                else if(i % 2 == 1)
                {
                    cout << " - ";
                }
                if(i%2 == 0){
                    cout <<":" ;
                }
            }
        }
        
        void addMeeting()
        {
            cout << "Meeting" << endl;
            cout << "from: " << endl;
            cin >> fHour>> fMinute;
            cout << "until:" << endl;
            cin >> uHour>> uMinute;
            if(checkNumbers(fHour,fMinute,uHour,uMinute)==true){
                schedule.push_back(fHour);
                schedule.push_back(fMinute);
                schedule.push_back(uHour);
                schedule.push_back(uMinute);
            }
            else
            {
                addMeeting();
            }
            
        }
        void addMeeting(int fromHour, int fromMinute, int untilHour, int untilMinute)
        {
            schedule.push_back(fromHour);
            schedule.push_back(fromMinute);
            schedule.push_back(untilHour);
            schedule.push_back(untilMinute);
        }
    
        void addAutoMeetings(int howMany){
            for (int i= 0; i < howMany;i++){
                fHour = rand()%24;
                fMinute=rand()%60;
                uHour = fHour + 1;
                uMinute = fMinute + 30;         //90 Minuten pro Termin
                if(checkNumbersWithoutCommands(fHour,fMinute,uHour,uMinute)==true){
                    addMeeting(fHour,fMinute,uHour,uMinute);
                }
                else{
                    i--; 
                }       
    
            }
        }
    };
    
    int main()
    {
        srand(time(0));
        //Time a(10,30,12,40);
        Time b(10);
    }
    


  • @mute7 sagte in Vector in Gruppen sortieren.:

    int fHour,fMinute,uHour,uMinute; //from - until
    vector<double> schedule;

    struct time_span { int fHour ; int fMinute ; int uHour; int uMinute;    }; //from - until 
    vector<time_span> schedule;
    


  • @mute7 sagte in Vector in Gruppen sortieren.:

    Ich verstehe nicht, wie ich mit einem String wie "10:30 - 12:00" rechnen kann.

    Gar nicht.

    Ich lasse 4 verschiedene Nummern generieren, wobei die Stunden nur von 0-24 und die Minuten von 0-60 gehen.

    Ok.

    Die speichere ich dann nacheinander in einem Vector ab.

    Warum das? Ein vector sollte gleichartige Dinge speichern, von denen du variable viele hast. Das, was du da hast, klingt eher nach vier einzelnen Variablen.

    Hier ist mein kompletter Code, falls das dann verständlicher ist (Ich bin neu in C++, hoffe der Code ist halbwegs verständlich) :

    Ist sehr hilfreich, damit wir hier überhaupt wissen, worum es genau geht!

    Die Probleme fangen schon bei den Klassen an. Was ist ein Meetingschedule und warum erbt "Time" davon? Der Name Time klingt nach Uhrzeit, aber das Ding scheint gar keine Uhrzeit zu sein, sondern ein Termin - oder gar ein ganzer Terminkalender? Ein Termin ist aber doch durch die beiden Uhrzeiten schon vollständig beschrieben und er braucht keinen vector<double> schedule;. Wieso kann Time (also dein Termin) nun auch auf einmal mit "numberOfMeetings" aufgerufen werden? Mir scheint, dass du zu viel in eine Klasse reinpacken willst. Eine Klasse für eine Aufgabe, nicht für mehrere!

    Deine gesamte Struktur ist merkwürdig.

    Mach dir eine Klasse Termin, die außer genau einen Termin zu kennen sonst nichts kann.

    Von dieser Klasse machst du einen vector.
    Und auch außerhalb der Termin-Klasse implementierst du das Einlesen.

    Das hier ist Blödsinn hoch 4:

        if(checkNumbers(fHour,fMinute,uHour,uMinute)==true){
            schedule.push_back(fHour);
            schedule.push_back(fMinute);
            schedule.push_back(uHour);
            schedule.push_back(uMinute);
        }
    

    Du solltest dem schedule ganze Termine geben, nicht unterschiedliche Einzelvariablen - denn wie du schon selbst gesehen hast, ergibt es keinen Sinn, Anfangsstunden mit Endminuten in demselben Vector zu speichern.



  • Danke. Du hast mir sehr weitergeholfen.
    Das mit den Klassen richtig anordnen und nicht alles in eine Klasse hauen macht natürlich Sinn (arbeite erst seit ca. einer Woche mit Klassen). Die Basisklasse hab ich vor Tagen erstellt, wovon ich erstmal eine Unterklasse zum Darstellen der Uhrzeit machen wollte, heute hab ich dann vergessen, dass diese überhaupt existieren und einfach alles in eine Klasse geschrieben, ups.
    Ich versuche mal mein Glück, das jetzt richtig hinzubekommen ^^
    Danke



  • @manni66
    Sowas hab ich gesucht, danke.



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten