11. april 2005 - 20:26Der er
23 kommentarer og 1 løsning
array sortering, fryser når den skal køre scriptet.
Hey, har brug for lidt panik hjælp, da det skal afleveres i morgen.
jeg har følgende kode, som jeg har sat sammen, til at sortere et array efter dato.
var Maaler = new Array(); Maaler[0] = new Maale(1000, 'dx4', '20-10-2004', 'Er placeret i køkkenet', '200', '400', 'Inde'); Maaler[1] = new Maale(1150, 'ax5', '20-01-2004', 'Under Affaldsspand', '200', '400', 'Ude'); Maaler[2] = new Maale(1250, 'ex2', '20-02-2003', 'Er placeret i toilet', '200', '400', 'Inde');
Der er ikke noget galt i ovenstående, men dette der kommer nu, er noget galt med. Maaler[i].Inst er lig med dato text strengenm, som skal sorteres efter.
function SortInst(vec, loBound, hiBound) { var pivot, loSwap, hiSwap, temp; if (hiBound - loBound == 1) { var Losplit = vec[loBound].Inst.split("-") var LoDate = new Date(Losplit[1] + "-" + Losplit[0] + "-" + Losplit[2]) var Hisplit = vec[hiBound].Inst.split("-") var HiDate = new Date(Hisplit[1] + "-" + Hisplit[0] + "-" + Hisplit[2])
if (LoDate > HiDate) { temp = vec[loBound].Inst; vec[loBound].Inst = vec[hiBound].Inst; vec[hiBound].Inst = temp; } return; } var Pivotsplit = vec[parseInt((loBound + hiBound) / 2)].Inst.split("-") var PivotDate = new Date(Pivotsplit[1] + "-" + Pivotsplit[0] + "-" + Pivotsplit[2])
Brug javascripts indbyggede Array.sort()-funktion ...
Men to spørgsmål:
Du har dem opbygget som objekter i et array, den position må godt ændres ?-)
-- er datoen _altid_ formatteret på den måde ?-)
Hvis det er ja til begge, så:
function mySort(a,b){ var str1 = a.Inst.split("-").reverse().join(""); var str2 = b.Inst.split("-").reverse().join(""); return str1>str2?1:str1<str2?-1:0; }
Maaler.sort(mySort);
-- den er størrelsesordenen 10000 gange hurtigere end quicksort efter mine målinger, men når vi skal splitte og joine bliver forskellen nok ikke så stor !-)
-- og så fik jeg også afprøvet det med følgende simple udgave af det samme:
<script type="text/javascript"> var Maaler = new Array(); Maaler[0] = {Inst:'20-10-2004'}; Maaler[1] = {Inst:'20-01-2004'}; Maaler[2] = {Inst:'20-02-2003'};
function mySort(a,b){ var str1 = a.Inst.split("-").reverse().join(""); var str2 = b.Inst.split("-").reverse().join(""); return str1>str2?1:str1<str2?-1:0; }
SortInst(Maaler, 0, Maaler.length-1) for (n=0;n<Maaler.length;n++) { udskrivning } så kan jeg skrive Maaler[n].Inst ud, hvor der er sorteret efter datoen.
det er så den der function SortInst() som skal laves om til det af dig, men kan ikke gennemskue hvad jeg skal ændre.
jeg er ikke meget for at ændre den måde mit array system er bygget op på, bruger det meget andre steder, så skal ændre det meget hvis det skal ændres. Men det kan da lade sig gøre at lave en lykke og skrive det om til en anden array:
Så fik jeg også kørt den med et almindeligt browser-vindue, og det resultat var:
Time to generate array: 3.515 s. Time to sort array: 164.813 s.
(mens alle andre ting kørte, jeg vil tro at minimum 20% ryger væk, hvis det kører alene -- og det tager under 2 sekunder med 1000 datoer !-)
-- og det er som nævnt min erfaring, at sorteringer foregår med en faktor på mange tusinde gange hurtigere, hvis man bruger den indbyggede sort-funktion i forhold til en quick-sort, så det alene er argument nok ...
Altså har man en tekststreng, som er rigtig at sortere efter direkte ...
-- reglerne for en compare-funktion, som bruges i en sort er, at positiv retur-værdi betyder at a er større end b (skal komme bagefter), negativ betyder a er mindre end b (skal komme før) og 0 betyder at der ikke skal ændres i rækkefølgen !-)
Det overdrevne brug af den ternære operator kunne også skrives:
ok mange tak, det var lige hvad jeg skulle bruge. Det vil så sige at jeg ikke kan stable et ordentlig agument på benene for at bruge Qsort, så må jeg bare ændre mine Qsorts til den nye metode.
men tak her fra.
det spørgsmål fra den anden dag, med at disable scrollbars(når piltasters bruges) ligger stadig åben :_P
Det er laaang tid siden, jeg foretog de tests af hastigheden, så jeg har ikke testscripts liggende mere, så mere præcist en min husker kan jeg ikke angive forskellen ...
-- men et hammergodt argument for at bruge Qsort er at bruge og forstå rekursivitet !-)
takker, har du styr på SQL sætninger. den mener er en syntaks fejl Insert into Maaler (idx, Map, Inst, Note, Xkoor, Ykoor, Sted) values(2323,'ax1','07-06-2001','adsadadada', '430', '216', 'Inde') og idx er et tal, resten er txt-strenge
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.