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

Hvilken streng kommer frst i alfabetet


jeg har lavet en funktion strengsammenlign(streng1, streng2) der returnerer:
   -1 hvis streng1 kommer fr streng2 i alfabetet,
   1 hvis streng2 kommer fr streng1,
   0 ellers.
og forresten, hvis streng1 og streng2 begge er tal, s bruges talvrdien 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 ls 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 sledes :

Strengene renses for accenter mv: -> E -> Ơ -> ؠ aa - > osv, evt. foranstillede tegn (tal komma sprgsmlstegn osv) pilles fra i en "fordel" og der alfabetiseres i frste omgang efter resten af strengene = "bagdel". Der alfabetiseres frst efter bagdele. Bagdelen kan evt indeholde bogstav(er) med tal bagved, er bogstaverne ens sorteres efter strste 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 frst efter valuta, er de ens s efter talvrdi. Kan fordelene ikke lses som tal laves en lemfldig alfabetisering ud fra fordelene.
Fr vrigt: @ regnes for det frste bogstav, s kommer A B C ... og til sidst Z . Tal (som str fr bogstaver) "alfabetiseres" efter numerisk vrdi, s 5 kommer fr 17 (ikke efter frste ciffier), og tallet kan evt efterflges af t af tegnene , i s fald lgges 0,25 0,50 eller 0,75 til talvrdien. Her er knapper s du kan prve 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  
Frst laver jeg alle tegnene i strengene om, s de tegn der kommer frst i alfabetet fr det laveste nummer, og tegn der skal alfabetiseres ens (f.eks. a og A og ) fr samme nummer. Hertil bruger jeg en streng jeg kalder alfabetstreng, som er p 256 tegn (nummer 0 .. 255), og nr 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 str som nr. 65 i alfabetstreng.
 
Tegnene grupperes sledes:
nyt nr 0-30 Forbudte tegn (linieskift osv)  195-199Valuta $ (tegn 200-214 ubrugt)
31- 32Mellemrumstegn, bldt og hrdt 215-218Grske tegn (219 ubrugt)
33-104Diverse smtegn, <, ; 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 prcise numre kan lses ud fra flgende store tabel:
<---------------- tabel med numre 1..255 og hvad de tilsvarende char laves om til ------------------------>
 
 
I tabellen kan jeg f.eks. lse, at tegn nr 240 er (islandsk bldt 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 vlg "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 fuldstndig forklaring.


TD>
function strengsammenlign(s1,s2){
// returner -1 hvis s1 alfabetiseres fr 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 funktionsvrdi.
function stoerststreng(s1, s2)

Sammenligner talvrdierne for tegnene i de to strenge, frst 1.ste tegn, er talvrdierne forskellige returneres 1 eller -1 og sammenligningen afsluttes, ellers fortsttes med 2.det tegn osv, er s1 og s2 ens returneres 0.
function stoersttal(t1, t2)

Prver om t1 og t2 begge kan opfattes som tal, kan de det returneres -1, 0, 1 efter hvilket tal der er strst, ellers sendes t1 og t2 videre til funktion stoerststreng og funktionsvrdien herfra bruges.