Avatar billede superraider Nybegynder
11. april 2005 - 20:26 Der 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])   
   
    pivot = vec[parseInt((loBound + hiBound) / 2)].Inst;
    vec[parseInt((loBound + hiBound) / 2)].Inst = vec[loBound].Inst;
    vec[loBound].Inst = pivot;
    loSwap = loBound + 1;
    hiSwap = hiBound;
    do {
        var LoSwapsplit = vec[loSwap].Inst.split("-")
        var LoSwapDate = new Date(LoSwapsplit[1] + "-" + LoSwapsplit[0] + "-" + LoSwapsplit[2])   
       
        while (loSwap <= hiSwap && LoSwapDate <= PivotDate){
            loSwap++;
       
        }
        var HiSwapsplit = vec[hiSwap].Inst.split("-")
        var HiSwapDate = new Date(HiSwapsplit[1] + "-" + HiSwapsplit[0] + "-" + HiSwapsplit[2])   
       
        while (HiSwapDate > PivotDate){
            hiSwap--;
        }
        if (loSwap < hiSwap) {
            temp = vec[loSwap].Inst;
            vec[loSwap].Inst = vec[hiSwap].Inst;
            vec[hiSwap].Inst = temp;
        }
    } while (loSwap < hiSwap);
    vec[loBound].Inst = vec[hiSwap].Inst;
    vec[hiSwap].Inst = pivot;
    if (loBound < hiSwap - 1){
        SortInst(vec, loBound, hiSwap - 1);
    }
    if (hiSwap + 1 < hiBound){
        SortInst(vec, hiSwap + 1, hiBound);
    }
}


200point til den der kan løse den.
Avatar billede superraider Nybegynder
11. april 2005 - 20:27 #1
Hvis det var en sortering af bare tal, så virker den ok, som nedenstående viser.
function SortMaaler(vec, loBound, hiBound) {
    var pivot, loSwap, hiSwap, temp;
    if (hiBound - loBound == 1) {
        if (vec[loBound].ID > vec[hiBound].ID) {
            temp = vec[loBound].ID;
            vec[loBound].ID = vec[hiBound].ID;
            vec[hiBound].ID = temp;
        }
        return;
    }
    pivot = vec[parseInt((loBound + hiBound) / 2)].ID;
    vec[parseInt((loBound + hiBound) / 2)].ID = vec[loBound].ID;
    vec[loBound].ID = pivot;
    loSwap = loBound + 1;
    hiSwap = hiBound;
    do {
        while (loSwap <= hiSwap && vec[loSwap].ID <= pivot){
            loSwap++;
        }
        while (vec[hiSwap].ID > pivot){
            hiSwap--;
        }
        if (loSwap < hiSwap) {
            temp = vec[loSwap].ID;
            vec[loSwap].ID = vec[hiSwap].ID;
            vec[hiSwap].ID = temp;
        }
    } while (loSwap < hiSwap);
    vec[loBound].ID = vec[hiSwap].ID;
    vec[hiSwap].ID = pivot;
    if (loBound < hiSwap - 1){
        SortMaaler(vec, loBound, hiSwap - 1);
    }
    if (hiSwap + 1 < hiBound){
        SortMaaler(vec, hiSwap + 1, hiBound);
    }
}
Avatar billede superraider Nybegynder
11. april 2005 - 20:34 #2
kan også lige sige at efter et stykke tid kommer dialogbox op og spørger om man vil afbryde script.
Avatar billede roenving Novice
11. april 2005 - 20:55 #3
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 !-)
Avatar billede roenving Novice
11. april 2005 - 21:00 #4
-- 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;
}

Maaler.sort(mySort);

alert(Maaler[0].Inst+"\n"+Maaler[1].Inst+"\n"+Maaler[2].Inst);
</script>
Avatar billede superraider Nybegynder
11. april 2005 - 21:10 #5
ok, jeg er ikke helt med på hvad jeg skal gøre.

jeg bruger det på følgende måde.

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.
Avatar billede superraider Nybegynder
11. april 2005 - 21:12 #6
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:

MaalerTemp[0] = {Inst:'20-10-2004'};
MaalerTemp[1] = {Inst:'20-01-2004'};
MaalerTemp[2] = {Inst:'20-02-2003'};
Avatar billede superraider Nybegynder
11. april 2005 - 21:22 #7
så har jeg forstået det, og det virker.

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;
}
function SortInst(vec, loBound, hiBound) {
Maaler.sort(mySort);
alert(Maaler[0].Inst+"\n"+Maaler[1].Inst+"\n"+Maaler[2].Inst);


at det er det eneste der skal til i stedet, så føler jeg mig dum. men tak, og post et svar
Avatar billede roenving Novice
11. april 2005 - 21:22 #8
Nej, det skal du slet ikke !-)
Avatar billede roenving Novice
11. april 2005 - 21:23 #9
-- ha og vi faldt lige over hinanden !-)

Velbekomme '-)
Avatar billede superraider Nybegynder
11. april 2005 - 21:27 #10
jeg skal også documentere det der sker, og det har je lidt svært ved. kan du ikke skytte et par ord til de metoder der er brugt.

var str1 = a.Inst.split("-").reverse().join("");
  var str2 = b.Inst.split("-").reverse().join("");
  return str1>str2?1:str1<str2?-1:0;
Avatar billede roenving Novice
11. april 2005 - 21:27 #11
-- og jeg lavede lige en showcase med 10000 tilfældigt genererede datoer, det tog den 3 minutter at sortere i min editors interne browser ...
Avatar billede superraider Nybegynder
11. april 2005 - 21:29 #12
og to kommentare til hvorfor jeg skulle vælge den ene metode frem for den anden. evt en godt grund til at jeg benytte quicksort nogen steder :P
Avatar billede roenving Novice
11. april 2005 - 21:43 #13
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 ...

-- og det der sker i mySort-funktionen er:

a.Inst = "20-10-2004" -->
.split() = ["20","10","2004"] -->
.reverse() = ["2004","10","20"] -->
.join("") = "20041020"

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:

if(str1>str2)
  return 1;
else if(str2>str1)
  return -1;
else
  return 0;
Avatar billede superraider Nybegynder
11. april 2005 - 21:49 #14
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
Avatar billede roenving Novice
11. april 2005 - 22:00 #15
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 !-)

-- og tak for point ;~}
Avatar billede superraider Nybegynder
11. april 2005 - 22:10 #16
så holder jeg mig så fra Qsort, for jeg har sku ikke forstået rekursivitet  :P

har et lille tilægs spørgsmål, kan man i et link tilføre til linket sådan at den afvikler en JS funktion efter siden er loadet.
Avatar billede roenving Novice
11. april 2005 - 22:17 #17
Tjah, tjoeh ...

-- du kan jo tilføje en parameter til querystring, som javascript så tester for at se om funktionen skal afvikles ...

F.eks.

<script type="text/javascript">

window.onload = function(){
  if(document.search){
    var q = document.search.substring(1);
    if(q.indexOf("runFunc"){
      q = q.split("=");
      if(q[1].indexOf("true")>-1)
        minFunktion();
    }
  }
}

</script>

-- den forudsætter så, at der præcis er een parameter i querystring, eller at den er den første ...

http://www.domaine.dk/index.html?runFunc=true
Avatar billede superraider Nybegynder
11. april 2005 - 22:21 #18
det jeg skal bruge er, at den skal kunne
http://www.domaine.dk/index.html?map=1xa

så skal den også køre ShowPic('1xa'), men tror nok jeg skal finde ud af det-
Avatar billede roenving Novice
11. april 2005 - 22:26 #19
Hvis der kun er den ene, bliver det:

<script type="text/javascript">

window.onload = function(){
  if(document.search){
    var q = document.search.substring(1);
    if(q.indexOf("map"){
      q = q.split("=");
      ShowPic(q[1]);
    }
  }
}

</script>
Avatar billede superraider Nybegynder
11. april 2005 - 22:41 #20
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
Avatar billede roenving Novice
11. april 2005 - 22:45 #21
Nej, det har jeg ikke pillet for alvor i fornylig, så der er jeg helt blank ...
Avatar billede superraider Nybegynder
11. april 2005 - 22:48 #22
ok
Avatar billede olebole Juniormester
12. april 2005 - 18:03 #23
<ole>

Prøv at escape tallet med enkelte gåseøjne  ;o)

/mvh
</bole>
Avatar billede superraider Nybegynder
12. april 2005 - 22:15 #24
har fået svar, det er note som er reseveet  [note]
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester