webForumDet fria alternativet

Sortera en array

18 svar · 733 visningar · startad av Wickmark

WickmarkMedlem sedan juli 2003162 inlägg
#1

Hej hej,
jag håller på med en liten ASP/JScript applikation som, genom att läsa en textfil, skriver upp en highscore-lista i ett mindre datorspel. ASP/Jscript skriver man ju med JScript kod, och all array-funktioner jag någonsin sett fungera i javascript, fungerar på samma gång i ASP/Javascript också, så det är anledningen till att jag postar här.

Datorspelet skriver ut poängen i följande format:
[Poäng];[Namn]

dvs. t ex:
400;Arne Johansson

Det jag gör sedan är att jag delar upp poängen i en array genom att dela upp dem i radbrytningarna!

arrWrite = sContent.split("\n");

Hur gör jag så att arrayen sorteras efter antal poäng?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Denna kod innehåller fel som omnämns här!

arrWrite = sContent.split("\n");
arrWrite = arrWrite.sort();

var hiScoreTable = [];

for (i=0; i<arrWrite.length; i++){
  hiScoreTable[i]=arrWrite[i].split();
}

// Skriv ut
document.write("<pre>");
for (i=hiScoreTable.length-1; i>-1; i--){
  document.writeln("Poäng: " + hiScoreTable[i][0] + "\tNamn: " + hiScoreTable[i][0]);
}
document.write("</pre>");
Erik JuhlinMedlem sedan maj 200010 687 inlägg
#3

nitro2k01: Om jag inte är helt fel ute så kommer din kod sätta 5;Pelle före 1000;Erik.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#4

Jo, men titta noga så ser du att den andra for-loopen läser array'en baklänges när poängen ska skrivas ut.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#5

Men man kan ju reversa arrayen också!

Denna kod innehåller fel som omnämns här!

 arrWrite = sContent.split("\n");
arrWrite = arrWrite.sort().reverse();

var hiScoreTable = [];

for (i=0; i<arrWrite.length; i++){
  hiScoreTable[i]=arrWrite[i].split();
}

// Skriv ut
document.write("<pre>");
for (i=0; i<hiScoreTable.length; i++){
  document.writeln("Poäng: " + hiScoreTable[i][0] + "\tNamn: " + hiScoreTable[i][0]);
}
document.write("</pre>");
RGBMedlem sedan dec. 1999419 inlägg
#6

Ett exempel på hur du kan sortera en array

<PRE>
<SCRIPT>
var a=["700;kalle","4300;kurt","800;korven","100;klas","10000;konny"];
a.sort(function(a,b){return(parseInt(b)-parseInt(a))});
var i = -1;var c;
while(i<a.length){ c=a[++i].split(";"); document.write("Score: "+c[0]+"\t\tBy: "+c[1]+"<br>");}
</SCRIPT>
</PRE>
Erik JuhlinMedlem sedan maj 200010 687 inlägg
#7

nitro2k01: Vad jag menade var att du gjorde en text-sortering vilket betyder att 5 är större än 1000.

RGB: Jo, att använda en egen sort-funktion är ju vettigt i det här fallet.
Javascripts parseInt är lite lustig som ignorerar bokstäver och annat som kommer efter siffrorna... :)

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#8

Som RGBs fast lite tydligare skrivet och ASP anpassat...

<%
function numericSort(a, b)
{
	return parseInt(b) - parseInt(a);
}

var player = ["700;kalle", "4300;kurt", "800;korven", "100;klas", "10000;konny"];

player.sort(numericSort);

for (var i = 0; i < player.length; i++)
{
	var playerData = player[i].split(";");
	Response.Write("Score: " + playerData[0] + "\t\tBy: " + playerData[1] + "<br>");
}
%>
WickmarkMedlem sedan juli 2003162 inlägg
#9

Nehe, något gick fel!

Kod:
arrWrite.sort(numericSort);

Fel:
Number expected

Innehåll i arrayen:
200;Affe Johansson, 2003;Arne Ålesson, 54000;Mästaren

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#10

Kanske är så att parseInt blir sur för att det kommer bokstäver i strängen. Min kod funkade dock när jag körde den.

Bara för att testa, prova att ta bort numericSort och kom tillbaka.

WickmarkMedlem sedan juli 2003162 inlägg
#11

Erik Juhlin skrev:

Kanske är så att parseInt blir sur för att det kommer bokstäver i strängen. Min kod funkade dock när jag körde den.

Bara för att testa, prova att ta bort numericSort och kom tillbaka.

Fungerade inge bra :(

Bifogar hela koden!

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="1252"%>
<!--#include virtual="/LWSWE/adojavas.inc"-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Po&auml;ngr&auml;knare</title>
<style type="text/css" media="all"> 
body, th, td, p, table {
  font-family: Arial, Verdana, Helvetica, sans-serif;
  font-size: 12px; 
  font-color: #000000;
}
</style>
</head>
<body>
<%
function numericSort(a, b){
	return b.parseInt - a.parseInt;
}
    var sChart   = new String(Server.MapPath("/LWSWE/_rubensoft_root/CAPPPoints/points.txt"));
    var oFSO     = new ActiveXObject("Scripting.FileSystemObject"),
        oFile    = oFSO.OpenTextFile(sChart, adModeRead),
        sContent = new String(oFile.ReadAll()), 
        arrWrite = new Array(),
        arrSub   = new Array();
           arrWrite = sContent.split("\n");       
        oFile.Close();
		
         arrWrite.sort(numericSort);
         
          for(var iX = 0; arrWrite.length > iX; iX++) {
            if(arrWrite[iX].length > 1) {
             arrSub = arrWrite[iX].split(";");
               Response.Write("<span style=\"font-weight:900; color:red; " +
                              "font-size:14px;\">" +
                              arrSub[0] + 
                              "</span><br />Spelare: " + 
                              arrSub[1] + 
                              "<hr noshade=\"noshade\" />");
            }
          }           
%>
</body>
</html>
Erik JuhlinMedlem sedan maj 200010 687 inlägg
#12

Vad fick du för fel när du tog bort numericSort?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#13

Jag tror det fixar sig om du gör så här:

arrWrite = sContent.split("\r\n");
if (arrWrite.length==0)
  arrWrite = sContent.split("\n");

Du kanske måste byta plats på \r och \n i första raden.

RGBMedlem sedan dec. 1999419 inlägg
#14

Du försöker hantera parseInt som en egenskap hos de värden du skickar till numericSort

function numericSort(a, b){
	return b.parseInt - a.parseInt;
}

Prova med

function numericSort(a, b){
try
{
	return parseInt(b) - parseInt(a);
}
catch(e)
{
	Response.write(e.description);
}
}

[Edit]18 oktober 2004 19:44[/edit]

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#15

Oj, det missade jag helt. Sånt meckar man ju inte med! :p

RGB: Man måste skriva Response.Write eftersom att JavaScript är case-sensivite... :)

RGBMedlem sedan dec. 1999419 inlägg
#16

Response.write funkar det med :)

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#17

Okej, objektet är case-sensitive. Men metoderna är inte det. :)

WickmarkMedlem sedan juli 2003162 inlägg
#18

Okej, nu vet jag felet, men vet inte riktigt hur jag så smidigt som möjligt kan lösa det.Det som händer är helt enkelt att det läggs till en extra tom del i arrayen.... som sen skapar ett fel när man försöker sortera den.

Felbeskrivning:
http://rubensoft.se/LWSWE/_rubensoft_root/CAPPPoints/

WickmarkMedlem sedan juli 2003162 inlägg
#19

Har löst det nu!
Fick lägga till följande kod:

		  if(String(arrWrite[arrWrite.length]) == "undefined")
		    arrWrite.length = arrWrite.length - 1;
		
		       try 
                         arrWrite.sort(numericSort);
		       catch(e) 
		         Response.Write(e.description);

Tack så mycket för er hjälp!

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)