2016-07-26 3 views
0

Wenn ich die Namen "Johnny" und "Bobby" habe, wie kann ich den Computer verwenden, um diese zu sortieren?Wie lautet die numerische Basis für eine alphabetisch sortierte Zeichenfolge?

Wenn ich sie numerisch miteinander vergleiche, scheint es nicht für alle Bedingungen zu gelten.

Bedenken Sie:

def listsum(numList): 
    theSum = 0 
    for i in numList: 
     theSum = theSum + i 
    return theSum 

test = 0 
mystr='BA' 
for code in map(ord, mystr): 
    test = test + listsum([code]) 
    print(test) 

und dann ändern,

mystr='AZ' 

So 155.

bekommen, kann ich nicht nur tun, einen ASCII-Vergleich. Was verwende ich für eine Basis, wenn ich es manuell mache? Ich möchte keine bestimmte Sprache oder eingebaute Sortiermethoden verwenden.

+0

Sie haben Ihre Sprache nicht gefunden, aber sie sieht wie Python oder Ruby aus. In jedem Fall müssten Sie jeden Buchstaben für zwei Strings lexikalisch vergleichen. –

+0

@TimBiegeleisen Ich habe die Sprache nicht markiert, weil ich sie nicht auf einer bestimmten Sprache basieren möchte. Ich bin an dem Konzept interessiert und habe Python als Beispiel benutzt. – johnny

Antwort

2

Vergleichen Sie das erste Zeichen. Wenn einer von ihnen in der Kodierungsreihenfolge früher als der andere ist, dann ist der String früher als der andere - und umgekehrt. Wenn sie gleich sind, fahren Sie mit dem nächsten Zeichen fort und machen Sie dasselbe. Wenn Sie das Ende beider Strings erreichen, sind die Strings gleich. Wenn Sie das Ende einer Zeichenfolge erreichen, ist diese Zeichenfolge früher.

Die Zusammenfassung hat nichts mit lexikographischer Ordnung zu tun.

Als Beispiel ist hier eine klare, aber nicht wirklich optimal, die Umsetzung der oben:

def str_cmp(a, b): 
    la = len(a) 
    lb = len(b) 

    if la == 0 and lb == 0: 
     return 0 # two empty strings are equal 
    if la == 0: 
     return -1 # an empty string is earlier than a non-empty one 
    if lb == 0: 
     return 1 # a non-empty string is later than an empty one 

    oa = ord(a[0]) 
    ob = ord(b[0]) 

    if oa < ob: 
     return -1 # a string whose initial character is earlier is earlier 
    if oa > ob: 
     return 1 # a string whose initial character is later is later 

    return str_cmp(a[1:], b[1:]) # strings with same initial characters compare 
            # the same as the strings with those characters 
            # chopped off 

Sie diese Funktion als cmp Parameter sort oder sorted verwenden können, wenn Sie es wünschen.