Reihenfolge verschieben

bdt600

Erfahrenes Mitglied
Hallo zusammen,
ich habe mir mittlerweile einen Knoten zusammen gedacht, ich komme einfach nicht drauf.

Ich habe eine Tabelle 1 mit diesen Spalten:

Spalte 0 - Spalte 1 - Spalte 2 - Spalte 3 - Spalte 4 - Spalte 5 - Spalte 6

Jetzt werden interaktiv (es handelt sich um eine Desktop-Anwendung) Spalten verschoben. Die Tabelle sieht dann so aus:

Spalte 0 - Spalte 6 - Spalte 4 - Spalte 3 - Spalte 2 - Spalte 5 - Spalte 1

Jetzt wird eine weitere Tabelle erzeugt, die wieder die Spalten in der Reihenfolge 0 bis 6 hat. Diese Tabelle soll jetzt so umsortiert werden, als wenn sie interaktiv genauso wie Tabelle 1 aussieht. Die einzige Möglichkeit, die ich habe, ist mit einer move-Funktion einzelne Spalten per Programmierung zu verschieben, also move(6,1) würde die Spalte 6 an Position 1 verschieben. Ich habe mich wohl in eine falsche Richtung verrannt und komme einfach nicht auf die Lösung. Wenn nur ein Spalte interaktiv verschoben wurde, ist das ja kein Problem, aber bei mehreren verschobenen Spalten hänge ich total in der Luft und finde keinen Algorithmus.

Wenn mich jemand in die richtige Richtung schubsen würde, bevor ich in die Tischkante beiße, wäre ich dankbar.

Ich hoffe, ich habe das Problem ausreichend geschildert, falls nicht, bitte einfach fragen.
 
Du schreibst deinen Beitrag unter "Sonstige Sprachen" ohne zu nennen in welcher du unterwegs bist.

Also in Power Query ist da ein einfacher Table.ReorderColumns
Code:
Table.ReorderColumns(table as table, columnOrder as list, optional missingField as nullable number) as table
 
Du schreibst deinen Beitrag unter "Sonstige Sprachen" ohne zu nennen in welcher du unterwegs bist.
Das Problem könnte ja in jeder Programmiersprache auftreten, daher habe ich das unter "Sonstige Sprachen" gepostet. Aber danke für deine Antwort.
Aber genauer: Qt mit C++

Noch mal kurz erklärt:

Bringe diese Reihenfolge

Spalte 0 - Spalte 1 - Spalte 2 - Spalte 3 - Spalte 4 - Spalte 5 - Spalte 6

mit move(vonSpalte, nachSpalte); in diese Reihenfolge

Spalte 0 - Spalte 6 - Spalte 4 - Spalte 3 - Spalte 2 - Spalte 5 - Spalte 1
 
Annahme: Bei einem Move wird ab der Zielposition alles nach hinten geschoben
Annahme: Zielreihenfolge ist nicht statisch sondren gespeichert und die Verschiebungen muss errechnet werden
Annahme: move(5, 4) bedeutet move(Startposition, Zielposition)

Die Zielstruktur von vorne nach hinten aufbauen.

Ablauf
Code:
aktuellList = [s0,s1,s2,s3,s4,s5,s6]
zielList = [s0,s6,s4,s3,s2,s5,s1]

For (i=0 to 6){
    wert = zielList[i];
    position = getListPosition(aktuellList, wert);
    aktuellList= move(position, i)
}

Test:
Code:
zielList[0] -> Wert s0 in aktuellLists uchen -> Position aktuell[0]
move(0, 0) -> aktuellList= s0 s1 s2 s3 s4 s5 s6

zielList[1] -> Wert s6 in aktuellLists uchen -> Position 6
move(6, 1) -> aktuellList= s0 s6 s1 s2 s3 s4 s5

zielList[2] -> Wert s4 in aktuellLists uchen -> Position 5
move(5, 2) -> aktuellList= s0 s6 s4 s1 s2 s3 s5

zielList[3] -> Wert s3 in aktuellList suchen -> Position 5
move(5, 3) -> aktuellList = s0 s6 s4 s3 s1 s2 s5

zielList[4] -> Wert s2 in aktuellList suchen -> Position 5
move(5, 4) -> aktuellList = s0 s6 s4 s3 s2 s1 s5

zielList[5] -> Wert s5 in aktuellList suchen -> Position 6
move(6, 5) -> aktuellList = s0 s6 s4 s3 s2 s5 s1

zielList[6] -> Wert s1 in aktuellList suchen -> Position 6
move(6, 6) -> aktuellList= s0 s6 s4 s3 s2 s5 s1
 
Zuletzt bearbeitet:
Danke für den Schubs in die richtige Richtung. Sieht so aus, als wenn das funktioniert:
C++:
void Ctable_view::move_columns(QTableView *source_table_view)
{
    QList<int> source_column_order = source_table_view->get_column_order();
    
    QHeaderView *header_view = horizontalHeader();
    
    int from, value;
    
    for (int to = 0; to < model()->columnCount(); to++)
    {
        from = source_column_order.indexOf(to);
 
        if (from != to)
        {
           header_view->moveSection(from, to);
          
           value = source_column_order.at(from);
          
           source_column_order.removeAt(from);
           source_column_order.insert(to, value);
        }
    }
}
 
Hmm.....gleiche Annahme 2 wie Yaslaw (Gespeicherte Reihenfolge):
Schon daran gedacht anstatt von vorne durch die Zielreihenfolge von hinten anzufangen?
ich denke da an einen Stack:
"Wirf S1 auf den Stack" --> unterste Position
"Wirf S5 auf den Stack"
"Wirf S2 auf den Stack"
....
 
Zurück