Eine Liste durchnummerieren

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Hallo,

Ich habe eine sehr generelle Frage. Wahrscheinlich ist sie nicht mal richtig hier, aber Apfeltalk hat leider nichts passenderes.

Ich arbeite gerade an einigen Markdown Formatierungs Skripten. Aktuell möchte ich aus einer Liste von Text:

Code:
foo
bar
    baz
    foobar
        foobaz
        barbaz
    bazbaz
foobarbaz

Gerne eine nummerierte Liste desselben Textes machen.

Code:
1. foo
2. bar
    1. baz
    2. foobar
        1. foobaz
        2. barbaz
    3. bazbaz
3. foobarbaz

Ich habe das schon soweit am laufen. Aktuell iteriere ich über die Menge an Zeilen. Es existiert ein Array in dem ich zu jeder Zeile die Anzahl an Einrückungen speichere. Beim drübergehen über die Liste schaue ich jetzt ob die vorherige Einrückung grösser ist als die aktuelle und fange je nachdem an neu zu zählen.
Das macht aber dann Probleme, wenn eine Unterliste wieder einrückt. Da ich derzeit, sobald eine tiefere Einrückung gefunden wird, den Counter zurück setze.

Meine Idee wäre jetzt eine neue Variable einzuführen in der ich zum Stand der aktuellen Einrückung den Counter Stand speichere, damit ich später weiter zählen kann.

Das klingt ziemlich aber umständlich und ich frage mich ob es eine bessere Lösung gibt? Ich komme einfach auf keine.

Es geht mir nicht darum dies in Objective-C zu lösen, sondern ich suche eine allgemeine Lösung. Ob ihr mir diese in Python, Ruby oder AppleScript (oder Obj-C) präsentiert ist eigentlich egal. Ich möchte mir das dann selbst herleiten.

Danke,
Andreas
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Das Stichwort heisst Rekursion:

Code:
[COLOR=#6D4026]#define indent [COLOR=#2226d3]2[/COLOR][/COLOR]

[COLOR=#b22798]void[/COLOR] prettyArray ([COLOR=#6536a0]NSArray[/COLOR] *array, [COLOR=#6536a0]NSInteger[/COLOR] level) {
    [COLOR=#6536a0]NSInteger[/COLOR] index;
    [COLOR=#6536a0]NSInteger[/COLOR] displayIndex = [COLOR=#2226d3]1[/COLOR];
    [COLOR=#b22798]for[/COLOR] (index = [COLOR=#2226d3]0[/COLOR]; index < array.[COLOR=#6536a0]count[/COLOR]; index++) {
        [COLOR=#b22798]id[/COLOR] object = [array [COLOR=#361c76]objectAtIndex[/COLOR]:index];
        [COLOR=#b22798]if[/COLOR] ([object [COLOR=#361c76]isKindOfClass[/COLOR]:[[COLOR=#6536a0]NSString[/COLOR] [COLOR=#b22798]self[/COLOR]]]) {
            [COLOR=#6536a0]NSMutableString[/COLOR] *prettyString = [[COLOR=#6536a0]NSMutableString[/COLOR] [COLOR=#361c76]string[/COLOR]];
            [COLOR=#6536a0]NSInteger[/COLOR] j;
            [COLOR=#b22798]for[/COLOR] (j=[COLOR=#2226d3]0[/COLOR]; j<level*[COLOR=#6d4026]indent[/COLOR]; j ++)
                [prettyString [COLOR=#361c76]appendString[/COLOR]:[COLOR=#cb291a]@" "[/COLOR]];
            [prettyString [COLOR=#361c76]appendFormat[/COLOR]:[COLOR=#cb291a]@"%d. %@"[/COLOR], displayIndex, object];
            [COLOR=#361c76]NSLog[/COLOR]([COLOR=#cb291a]@"%@"[/COLOR], prettyString);
            displayIndex ++;
        }
        [COLOR=#b22798]else[/COLOR] [COLOR=#b22798]if[/COLOR] ([object [COLOR=#361c76]isKindOfClass[/COLOR]:[[COLOR=#6536a0]NSArray[/COLOR] [COLOR=#b22798]self[/COLOR]]]) {
            [COLOR=#2b4e53]prettyArray[/COLOR](object, level + [COLOR=#2226d3]1[/COLOR]);
        }
        [COLOR=#b22798]else[/COLOR] {
[COLOR=#cb291a][COLOR=#000000]            [/COLOR][COLOR=#361c76]NSLog[/COLOR][COLOR=#000000] ([/COLOR]@"LOLWUT? Don't know how to handle %@"[COLOR=#000000], [object [/COLOR][COLOR=#361c76]description[/COLOR][COLOR=#000000]]);[/COLOR][/COLOR]
        }
    }
}


[COLOR=#b22798]int[/COLOR] main([COLOR=#b22798]int[/COLOR] argc, [COLOR=#b22798]const[/COLOR] [COLOR=#b22798]char[/COLOR] * argv[])
{


[COLOR=#b22798][COLOR=#000000]    [/COLOR]@autoreleasepool[COLOR=#000000] {[/COLOR][/COLOR]
        
        [COLOR=#6536a0]NSArray[/COLOR] *zetttArray = [[COLOR=#6536a0]NSArray[/COLOR] [COLOR=#361c76]arrayWithObjects[/COLOR]:
                              [COLOR=#cb291a]@"foo"[/COLOR],
                              [COLOR=#cb291a]@"bar"[/COLOR],
                                [[COLOR=#6536a0]NSArray[/COLOR] [COLOR=#361c76]arrayWithObjects[/COLOR]:
                                 [COLOR=#cb291a]@"baz"[/COLOR],
                                 [COLOR=#cb291a]@"foobar"[/COLOR],
                                    [[COLOR=#6536a0]NSArray[/COLOR] [COLOR=#361c76]arrayWithObjects[/COLOR]:
                                     [COLOR=#cb291a]@"foobaz"[/COLOR],
                                     [COLOR=#cb291a]@"barbaz"[/COLOR],
                                     [COLOR=#b22798]nil[/COLOR]],
                                 [COLOR=#cb291a]@"bazbaz"[/COLOR],
                                 [COLOR=#b22798]nil[/COLOR]],
                              [COLOR=#cb291a]@"foobarbaz"[/COLOR],
                              [COLOR=#b22798]nil[/COLOR]];


        [COLOR=#2b4e53]prettyArray[/COLOR](zetttArray, [COLOR=#2226d3]0[/COLOR]);
        
    }
    [COLOR=#b22798]return[/COLOR] [COLOR=#2226d3]0[/COLOR];
}

Alex
 

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Ah, OK. Das kriege ich dann hin. Danke für die prompte Antwort, Alex.

Andreas

PS: Gerade zufällig mit meinem Zahnarzt telefoniert wegen röntgen meines Zahnes der eine Wurzelspitzenrekursion bekommen hat. Verleser des Tages. ;)
 

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Hi Alex, bin gerade erst dazu gekommen mir den Code anzuschauen.

Seh ich das richtig, du würdest die komplette Liste erstmal in Arrays packen und die dann durchnummerieren? Vielleicht habe ich mich auch falsch ausgedrückt. Input ist nämlich das hier:

Code:
myString = "foo
bar
    baz
    foobar
        foobaz
        barbaz
    bazbaz
foobarbaz"
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Oh, ja, das habe ich falsch verstanden, ich dachte Du hättest ein Array.

Du kannst es entweder in einen Array umbestellt, oder die Leerzeichen zählen. Aktuell hab ich wenig Zeit, ping mich an wen's dringend ist

Keks
 

Zettt

Doppelter Melonenapfel
Registriert
16.10.05
Beiträge
3.374
Beiss mich da jetzt schon durch. Danke.