- QString getColumnName(int index)
- {
- QString result;
- while (index >= 0) {
- int c = (index % 26);
- index = index / 26 - 1;
- result.insert(0, (char)(65 + c));
- }
- return result;
- }
DGL https://delphigl.com/forum/ |
|
Spaltennamen wie in Excel https://delphigl.com/forum/viewtopic.php?f=37&t=10298 |
Seite 1 von 1 |
Autor: | Frase [ Mi Feb 08, 2012 02:04 ] |
Betreff des Beitrags: | Spaltennamen wie in Excel |
Habe einen Vorschlag: Schreibe eine Methode, die Spaltennamen (wie aus Excel, Calc, Numbers, etc. bekannt) zurückliefert. Also: A, B, C, D, ..., Z, AA, AB, AC, AD, AE, ..., AZ, BA, BB, BC, ... Die Methode nimmt einen Int, der die Spaltennummer darstellt. Wobei 0 = A, 1 = B, 2 = C, usw. und liefert den entsprechenden Spaltennamen als String zurück. Mfg ~ Frase |
Autor: | Aya [ Mi Feb 08, 2012 12:20 ] |
Betreff des Beitrags: | Re: Design Challenge Vorschläge |
Frase hat geschrieben: Schreibe eine Methode, die Spaltennamen (wie aus Excel, Calc, Numbers, etc. bekannt) zurückliefert. Ist das nicht etwas zu simpel? Code:
Aya |
Autor: | Lord Horazont [ Mi Feb 08, 2012 13:45 ] |
Betreff des Beitrags: | Re: Spaltennamen wie in Excel |
Rekursiv: Code:
Iterativ: Code:
Als (effizienter) Generator: Code:
Anwendung: Code:
//edit: Generator-Code korrigiert Wer sich übrigens fragt, wofür man einen unendlichen Generator braucht, dem sei der Ausdruck: Code:
ans Herz gelegt . Anstatt der List Comprehension für cells kann man auch wunderbar eine bestehendes 2D-Array mit erstem Index ≙ Spalte und zweitem Index ≙ Zeile nehmen. Wenn das Array transponiert ist, lässt man einfach den *zip()-Aufruf um *cells herum weg (also *zip(*cells) => *cells). Dank des unendlichen Generators ist der Ausdruck unabhängig von den Dimensionen des Arrays. |
Autor: | Frase [ Mi Feb 08, 2012 19:40 ] |
Betreff des Beitrags: | Re: Spaltennamen wie in Excel |
Code: Und in Verwendung: Code:
liefert: Code:
Featuring Pattern Matching und so. @Horazont: Das Divmod sieht ja putzig aus Die Generatoren-Lösung ist alles andere als putzig. Die ist eher... strange. Klingt nach einem Konzept, was man sich mal zu Gemüte führen sollte. @Aya: Yay, eine iterative C++ Lösung Muss man den QString nicht erst mit irgendwas initialisieren? Oder liegt der da jetzt schon so auf dem Stack herum? Der Aufruf an result.insert kommt mir etwas spanisch vor ansonsten. |
Autor: | Lord Horazont [ Mi Feb 08, 2012 20:29 ] |
Betreff des Beitrags: | Re: Spaltennamen wie in Excel |
Frase hat geschrieben: @Horazont: Das Divmod sieht ja putzig aus Die Generatoren-Lösung ist alles andere als putzig. Die ist eher... strange. Klingt nach einem Konzept, was man sich mal zu Gemüte führen sollte. Nun, ein Generator ist nichts weiter als ein parametrisierter Iterator. Jedes yield gibt ein neues Element zurück (d.h. die Funktion wird dort bis zum nächsten aufruf von next() praktisch unterbrochen). Wenn nichts mehr rauskommt (return oder einfach ende der Funktion) wird implizit ne EndOfIteration Exception geworfen… Die Python-Schleifen wissen dann, das Schluss ist . Der Benutzer merkt davon nichts, wenn er nicht per Hand next() aufruft. greetings |
Autor: | yunharla [ Fr Feb 17, 2012 15:42 ] |
Betreff des Beitrags: | Re: Spaltennamen wie in Excel |
Zeit für ein bissl Shell Code:
|
Autor: | TAK2004 [ So Feb 19, 2012 15:41 ] |
Betreff des Beitrags: | Re: Spaltennamen wie in Excel |
Code:
Die Variante ist auf Performance ausgelegt, es wird zuerst die Anzahl der Spalten errechnet, um dann den benötigten Speicher zu allozieren und direkt auf einen Array zu arbeiten. Ich muss aus meiner Stringklasse den char* pointer ziehen, da der Array operator[] ein Funktionsaufruf ist und entsprechend overhead und unnötig mehr CPU aufwand produziert(im release build kann je nach compiler das natürlich inlined werden aber halt je nach compiler und nicht für alle). Der erzeugte String wird dann mit dem übergebenen ausgetauscht(ist die Stringklasse aus Radon Framework, die arbeitet intern mit nen Array pointer). Das Resultat wird als Referenz-Parameter zurück gegeben, damit nicht noch zwischenobjekte auf dem Stack erzeugt werden, wie bei der Funktionsrückgabe(C# z.B. würde Speicher für object erzeugen und dann den pointer hin und her kopieren aber bei C++ würde er die Klasse neu anlegen, copy constructor aufrufen und ne riesen sauerei produzieren). CPU's sind immer schneller als der Speicher(je mobiler des so stärker der Unterschied) daher kann man unmengen an Berechnungen machen, bevor Speicherzugriffe günstiger sind und wenn man dann noch dynamische Speicheralloziierung im Code hat, dann sowieso. Ich hab noch ein bisschen mit Caching experimentiert aber das macht hier kein Sinn, das es zu wenig Daten und zu einfache Berechnungen sind. Da reicht das CPU interne Caching und Predicted-Caching aus. Ich hab beim experimentieren noch ein Bug in meiner Insert Methode, von der Stringklasse, gefunden und gefixt |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |