:Retur til startside :Til JavaScript startside  :object Array  :object String

Hvilken streng kommer først i alfabetet


jeg har lavet en funktion strengsammenlign(streng1, streng2) der returnerer:
   -1 hvis streng1 kommer før streng2 i alfabetet,
    1 hvis streng2 kommer før streng1,
   0 ellers.
og forresten, hvis streng1 og streng2 begge er tal, så bruges talværdien i stedet.
Denne side beskriver funktion strengsammenlign, hvis du er ligeglad med det men bare skal bruge den kan du kopiere den,
download denne fil (STRSORT.HTM) og læs den ind i det tekstbehandlingsprogram du bruger til at skrive HTML-koder med. Kopier hele det store <SCRIPT>-afsnit der er i filens HEAD-afsnit.


Set fra et brugersynspunkt fungerer det således :

Strengene renses for accenter mv:  ê -> E   æ -> Æ   ö -> Ø   aa - >Å  osv, evt. foranstillede tegn (tal komma spørgsmålstegn osv) pilles fra i en "fordel" og der alfabetiseres i første omgang efter resten af strengene = "bagdel". Der alfabetiseres først efter bagdele. Bagdelen kan evt indeholde bogstav(er) med tal bagved, er bogstaverne ens sorteres efter største tal, 10 > 5 (ikke efter ciffer, hvor 10 < 5 da 1 < 5).
Er bagdelene ens sorteres efter fordele, hvis de kan opfattes som tal (evt med valutategn ( ¥ ¢ $ € £ ) bagved ) alfabetiseres først efter valuta, er de ens så efter talværdi. Kan fordelene ikke læses som tal laves en lemfældig alfabetisering ud fra fordelene.
Før øvrigt: @ regnes for det første bogstav, så kommer A B C ... og til sidst Z þ Æ Ø Å. Tal (som står før bogstaver) "alfabetiseres" efter numerisk værdi, så 5 kommer før 17 (ikke efter første ciffier), og tallet kan evt efterfølges af ét af tegnene ¼ ½ ¾, i så fald lægges 0,25 0,50 eller 0,75 til talværdien. Her er knapper så du kan prøve hvad strengene alfabetiseres som, indtast to strenge og se udregningen ved at klikke på de runde knapper:

Indtast to strenge:  s1 =  s2 =
og klik på sammenlign (som burde hedde strengsammenlign( s1, s2 )  ) :
  sammenlign : 
 
  tilretstreng(s1) :  
bagdelfordel
  tilretstreng(s2) :  
bagdelfordel

Vil du vide mere :


Strenge indeholder max 256 forskellige tegn, nummereret 0..255  
Først laver jeg alle tegnene i strengene om, så de tegn der kommer først i alfabetet får det laveste nummer, og tegn der skal alfabetiseres ens (f.eks. a og A og á) får samme nummer. Hertil bruger jeg en streng jeg kalder alfabetstreng, som er på 256 tegn (nummer 0 .. 255), og når så jeg skal give et nyt nummer til f.eks A som har nummer 65, så bruger jeg tegnet (eller rettere nummeret på tegnet) som står som nr. 65 i alfabetstreng.
 
Tegnene grupperes således:
nyt nr 0-30 Forbudte tegn (linieskift osv)  195-199Valuta ¥¢$€£ (tegn 200-214 ubrugt)
 31- 32Mellemrumstegn, blødt og hårdt 215-218Græske tegn (219 ubrugt)
 33-104Diverse småtegn, <, ; osv 220 @ (alfabetiseres som 1.ste bogstav)
105-167bruges ikke 221-239A-S
168-170© ®    ( 171 & 173 ubrugt ) 240 ubrugt ( reserve ß )
172-176Punktum, , komma, minus, plus 241-247T - Z ,   248-249: ubrugt
177-190Tal: 0,1..9, ¼ ½ ¾ (187 ubr.) 250-254250: þ, 251 ubrugt, 252-254: Æ Ø Å

De præcise numre kan læses ud fra følgende store tabel:
<---------------- tabel med numre 1..255 og hvad de tilsvarende char laves om til ------------------------>
 
 
I tabellen kan jeg f.eks. læse, at tegn nr 240 er ð (islandsk blødt d), og det laves om til tegn nr. 224, og at tegnet D også laves om til tegn nr 224. Så jeg har valgt at lade ð alfabetisere som om det var et D.



Selve javaScript-koden ses bedst ud fra kildeteksten til denne fil (i Internet Explorer, klik "vis" og vælg "kilde".
Jeg viser her koden til funktion strengsammenlign(s1, s2), men den virker jo kun hvis de funktioner den kaldeer virker, og de kaldte funktioner kalder så igen nogle funktioner osv, jeg giver ikke en fuldstændig forklaring.


TD>
function strengsammenlign(s1,s2){
// returner -1 hvis s1 alfabetiseres før s2, 0 hvis ens, 1 ellers
    s1=tilretstreng(s1);
    s1pilfra=indledning;
    s2=tilretstreng(s2);
    s2pilfra=indledning;
    var i=stoerststreng(s1,s2);
    if (i!=0) return i
    else return stoersttal(s1pilfra, s2pilfra);
}
 
 
 // funktion tilretstreng returnerer bagdel
 // fordel = global variabel indledning
 
 
 // funktion stoerststreng sammenligner to strenge
 // Hvis de to bagdele er ens bliver i=0
 // funktion stoersttal sammenligner to tal

function sletforbagmellem(streng)

fjerner alle indledende og afsluttende blanktegn i streng.
function tilretstreng(streng)

Laver tegnene i streng om i henhold ti den store tabel ovenfor. Renser for blanktegn med sletforbagmellem(). Desuden deles strengen op i fordel og bagdel, fordel skrives til global variabel indledning, og bagdel returneres som funktionsværdi.
function stoerststreng(s1, s2)

Sammenligner talværdierne for tegnene i de to strenge, først 1.ste tegn, er talværdierne forskellige returneres 1 eller -1 og sammenligningen afsluttes, ellers fortsættes med 2.det tegn osv, er s1 og s2 ens returneres 0.
function stoersttal(t1, t2)

Prøver om t1 og t2 begge kan opfattes som tal, kan de det returneres -1, 0, 1 efter hvilket tal der er størst, ellers sendes t1 og t2 videre til funktion stoerststreng og funktionsværdien herfra bruges.