Ich brauch eine Methode, die mir zu jedem Buchstaben die entsprechende Zahl von 1 bis 26 gibt und umgekehrt...?

  • Ich brauch eine Methode, die mir zu jedem Buchstaben die entsprechende Zahl von 1 bis 26 gibt und umgekehrt...?

    Ich brauche das zum Chiffrieren und will wissen, ob es eine Klasse gibt, die schon eine solche Methode beinhaltet
    und wenn nicht, wie ich das ganze dann angehe...
    Vielleicht geht es am einfachsten mit einem Objekt der Klasse NSDictionary, in das ich in die Keys die Zahlen und in die Objekte die Buchstaben schreibe und so jeweils den anderen herausfinden kann... Aber wie gesagt, ich hoffe es gibt bereits eine solche Methode... Kennt ihr sie?
    Wer schreibt schon Signaturen... Ich brauch' keine Signatur...
  • Kleines Beispiel:

    Quellcode

    1. // Aufruf
    2. NSLog(@"Position %i", [self characterNumber:@"X"]);
    3. -(NSInteger)characterNumber:(NSString *)myChar
    4. {
    5. NSString *alphabetGross = @"ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ";
    6. NSString *alphabetKlein = @"abcdefghijklmnopqrstuvwxyzäöüß";
    7. NSRange position = [alphabetGross rangeOfString:myChar];
    8. if (position.length == 0)
    9. {
    10. position = [alphabetKlein rangeOfString:myChar];
    11. }
    12. if (position.length == 0)
    13. {
    14. position.location = -1;
    15. return position.location
    16. }
    17. return position.location + 1;
    18. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ramo ()

  • ramo schrieb:

    Kleines Beispiel:

    Quellcode

    1. // Aufruf
    2. NSLog(@"Position %i", [self characterNumber:@"X"]);
    3. -(NSInteger)characterNumber:(NSString *)myChar
    4. {
    5. NSString *alphabetGross = @"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    6. NSString *alphabetKlein = @"abcdefghijklmnopqrstuvwxyz";
    7. NSRange position = [alphabetGross rangeOfString:myChar];
    8. if (position.length == 0)
    9. {
    10. position = [alphabetKlein rangeOfString:myChar];
    11. }
    12. if (position.length == 0)
    13. {
    14. position.location = -1;
    15. return position.location
    16. }
    17. return position.location + 1;
    18. }
    Alles anzeigen


    und warum nicht einfacher (und vor allem viel performanter:

    Quellcode

    1. - (UInt8)characterNumberFromString:(NSString *) theCharAsString
    2. {
    3. if (![theCharAsString length]) return 0;
    4. unichar c = [[theCharAsString uppercaseString] characterAtIndex:0];
    5. if (c < 'A' || c > 'Z') return 0;
    6. return (UInt8)(c - 'A' + 1);
    7. };

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von gritsch ()

  • zerm schrieb:

    ramo schrieb:

    Kleines Beispiel

    Wow. Das ist der ineffizienteste Ansatz, der mir einfällt.
    Halt moment, wie wäre es damit: 2*26 Dateien abspeichern, benannt "a" bis "Z" und enthalten ein NSDictionary was eine NSNumber von 1 bis 26 enthält. Die werden dann pro Buchstabe gelesen und zurückgegeben.


    vielleicht als kontrolle noch eine abfrage bei google machn und das dann mit dem ergebnis eines eigenen webservices abgleichen ;)
  • gritsch schrieb:

    Thallius schrieb:

    gritsch schrieb:

    das geht aber komplett schief wenn entweder der string leer ist, oder ich zb @"[" übergebe! außerdem ist es unleserlich!


    Beim leeren String gebe ich Dir recht und die 98 ist nen vertipper. Das soll natuerlich 91 heissen.

    Gruß

    Claus


    unübersichtlich ist es immer noch!


    Naja also die Frage ist was an so einer Funktion übersichtlich sein muss. Die soll doch einfach nur schnell sein und das ist sie definitiv so mehr als wenn ich für jeden Buchstaben erst noch ein Uppercase aufrufe.
    Noch dazu hatte ich gehofft mit dem dicken Smily klarzustellen, dass eine gewisse Ironie in dem Posting liegen sollte. Aber irgenwie werde ich hier eh immer mißverstanden oder man will es einfach mißverstehen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • zerm schrieb:

    ramo schrieb:

    Kleines Beispiel

    Wow. Das ist der ineffizienteste Ansatz, der mir einfällt.
    Halt moment, wie wäre es damit: 2*26 Dateien abspeichern, benannt "a" bis "Z" und enthalten ein NSDictionary was eine NSNumber von 1 bis 26 enthält. Die werden dann pro Buchstabe gelesen und zurückgegeben.


    Ja, mag sein, aber viele Wege führen nach Rom und scheinbar gibt es Leute denen keiner einfällt ? Und da wären dann noch ä, ö, ü, Ä, Ö, Ü, ß ??
  • ramo schrieb:

    zerm schrieb:

    ramo schrieb:

    Kleines Beispiel

    Wow. Das ist der ineffizienteste Ansatz, der mir einfällt.
    Halt moment, wie wäre es damit: 2*26 Dateien abspeichern, benannt "a" bis "Z" und enthalten ein NSDictionary was eine NSNumber von 1 bis 26 enthält. Die werden dann pro Buchstabe gelesen und zurückgegeben.


    Ja, mag sein, aber viele Wege führen nach Rom und scheinbar gibt es Leute denen keiner einfällt ? Und da wären dann noch ä, ö, ü, Ä, Ö, Ü, ß ??


    es wurde ja aber schun einer genannt und daher muss man nicht einen posten der viel ineffizienter und unübersichtlicher ist.

    und was spricht dagegen den code für DEUTSCHE umlaute zu erweitern? ist doch kein problem - war aber nicht die fragestellung (1-26).
  • Thallius schrieb:

    Naja also die Frage ist was an so einer Funktion übersichtlich sein muss. Die soll doch einfach nur schnell sein und das ist sie definitiv so mehr als wenn ich für jeden Buchstaben erst noch ein Uppercase aufruf

    Ich glaube kaum, dass das viel ausmacht. Das Hauptproblem an Deinem Code ist aber, in meinen Augen, dass Du Dezimal-Werte anstelle Char-Konstanten verwendest. Du hattest Dich ja schon selbst vertan.
    C++
  • zerm schrieb:

    Thallius schrieb:

    Naja also die Frage ist was an so einer Funktion übersichtlich sein muss. Die soll doch einfach nur schnell sein und das ist sie definitiv so mehr als wenn ich für jeden Buchstaben erst noch ein Uppercase aufruf

    Ich glaube kaum, dass das viel ausmacht. Das Hauptproblem an Deinem Code ist aber, in meinen Augen, dass Du Dezimal-Werte anstelle Char-Konstanten verwendest. Du hattest Dich ja schon selbst vertan.


    ganz meiner meinung. das upeprcase vereinfacht das ganze halt ein bisschen und wird nicht wirklich viel zeit brauchen... ansosnten kannst das ja weglassen und zb if (c > 'Z') c -= 'a' - 'A'; oder eben den restlichen code mit || und && machen.
  • zerm schrieb:

    ramo schrieb:

    Kleines Beispiel

    Wow. Das ist der ineffizienteste Ansatz, der mir einfällt.
    Halt moment, wie wäre es damit: 2*26 Dateien abspeichern, benannt "a" bis "Z" und enthalten ein NSDictionary was eine NSNumber von 1 bis 26 enthält. Die werden dann pro Buchstabe gelesen und zurückgegeben.

    Es ist hier allerdings der einzige Ansatz, der unabhängig vom verwendeten Zeichencode ist. ;)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?