07. marts 2003 - 13:49Der er
17 kommentarer og 1 løsning
Sortere i strArray
Hej
Mit spørgsmål er kort og godt om det er muligt at sortere i et str-array. Jeg har et array med en masse strenge efter formen:
navn/tal1/tal2/tal3/tal4/
mit spørgsmål er så om jeg kan sortere disse strenge således at den streg med højst tal4 kommer øverst, herefter tal3 osv.. Såfrem der er to tal4 der er ens skal der sorteres efter tal 3.
Det er fordi jeg har en DB over en masse fodboldresultater. Jeg skal ha et udtræk af de seneste eks. 5 kampe for hvert hold - beregne point og målscore og så ha dem sorteret så der kan udskrives en stilling...
Jeg er lidt løbet panden mod en mur... jeg ved ikke om det i det hele taget kan lade sig gøre når data er lageret på den måde som de er.
For hvert hold der er med i databasen skal jeg så ha beregnet:
målscore, vundne, uafgjorte, tabte, point
for et valgtfrit antal kamp.
Vælger brugeren eksempelvis 5 skal der ud fra de beregnede tal for hvert hold opstilles en stilling. Det var her arrayet kom ind i billedet idet jeg tænkte at jeg kunne samte oplysningerne i en str og sortere det i et array.
Har du evt. et bedre forslag? hvad gør jeg?
Som jeg ser det er det intet problem at få tallene beregnet - problemet er at sortere skidtet efter følgende prioritet.
1. pointantal 2. differencen i målscoren 3. flest scorede mål
Åh, ja, point for fodboldkampe.... Hvordan er det nu reglerne er :)
Men nu siger du så ASP.... i PHP ville jeg putte data ind i objekter, skrive sammenligningsfunktionen, og så bruge den indbyggede sortering. Skal du pakke dem her ud hver gang, så du kan kigge på de individuelle tal, så et det bøvlet og dyrt.
Hvad med at have det på formen:
000033/000333/003333/000001/00002/noget andet
Altså fast længde, med foranstillede 0'er? Så kan du bare sortere som tekststrenge.
Jeg er ikke lige helt..... altså stadig en steng pr. hold eller hvad? hvad er fordelen ved fast længde? Giver det ikke problemer hvis differencen i målscoren er negativ.... kan det så ikke ende ud i ex. 0000-1
Åh, nej, negative tal .... Men da '-' er mindre end '0' går det alligevel. Med fastlængde kan du bare sammenligne og sortere som tekst, uden at pille de enkelte felter ud. Vigtigste sorteringskriterium først.
Ja, hver streng i et array - ikke sortere på delstrenge. Men det er da lidt "nørdet" at gøre det sådan.... Man kan nok ikke så meget andet i gammeldags ASP/VB
Sub SingleSorter( byRef arrArray ) Dim row, j Dim StartingKeyValue, NewKeyValue, swap_pos
For row = 0 To UBound( arrArray ) - 1 'Take a snapshot of the first element 'in the array because if there is a 'smaller value elsewhere in the array 'we'll need to do a swap. StartingKeyValue = arrArray ( row ) NewKeyValue = arrArray ( row ) swap_pos = row
For j = row + 1 to UBound( arrArray ) 'Start inner loop. If arrArray ( j ) < NewKeyValue Then 'This is now the lowest number - 'remember it's position. swap_pos = j NewKeyValue = arrArray ( j ) End If Next
If swap_pos <> row Then 'If we get here then we are about to do a swap 'within the array. arrArray ( swap_pos ) = StartingKeyValue arrArray ( row ) = NewKeyValue End If Next End Sub
Skreve disse funktioner til sortering af array's for nogen tid siden Function ShellSort(vArray) Dim TempVal Dim i, GapSize, CurPos Dim FirstRow, LastRow, NumRows FirstRow = LBound(vArray) LastRow = UBound(vArray) NumRows = LastRow - FirstRow + 1 Do GapSize = GapSize * 3 + 1 Loop Until GapSize > NumRows Do GapSize = GapSize \ 3 For i = (GapSize + FirstRow) To LastRow CurPos = i TempVal = vArray(i) Do While CompareResult(vArray(CurPos - GapSize),TempVal) vArray(CurPos) = vArray(CurPos - GapSize) CurPos = CurPos - GapSize If (CurPos - GapSize) < FirstRow Then Exit Do Loop vArray(CurPos) = TempVal Next Loop Until GapSize = 1 End Function
Function CompareResult(Value1, Value2) CompareResult = (Value1 > Value2) End Function
Det ligner meget det jeg søger. Jeg kunne imidlertid godt tænke mig om det var tal den kunne sortere. Problemet er lige nu at hvis jeg beder den sortere:
40 9 18
bliver rækkefølgen:
9 40 18
fordi den tager første tal først. Kan du ændre det? Endvidere var det planen at jeg gerne ville ha at der var to kriterer således at den sorterer først efter x og derefter efter y hvis formen er sådan her x/y
' Skreve disse funktioner til sortering af array's for nogen tid siden Function ShellSort(vArray) Dim TempVal Dim i, GapSize, CurPos Dim FirstRow, LastRow, NumRows FirstRow = LBound(vArray) LastRow = UBound(vArray) NumRows = LastRow - FirstRow + 1 Do GapSize = GapSize * 3 + 1 Loop Until GapSize > NumRows Do GapSize = GapSize \ 3 For i = (GapSize + FirstRow) To LastRow CurPos = i TempVal = vArray(i) Do While CompareResult(CDbl(vArray(CurPos - GapSize)),CDbl(TempVal)) vArray(CurPos) = vArray(CurPos - GapSize) CurPos = CurPos - GapSize If (CurPos - GapSize) < FirstRow Then Exit Do Loop vArray(CurPos) = TempVal Next Loop Until GapSize = 1 End Function
Function CompareResult(Value1, Value2) CompareResult = (Value1 < Value2) End Function
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.