Hej, Det är helt klart mycket lättare att sortera en array än en sträng. Den här jämför ASCII-värdena. Då hamnar talen i fel ordning, förutsatt att man vill sortera efter det egentliga värdet. Exempelvis hamnar 12345 mellan talen 1232 och 1545. Tack! Som Roger påpekade kommer funktionen att sortera "fel" om arrayen innehåller strängar som i ditt fall. Därför behöver du byta ut en rad: Har "Lånat" SvenPon's QuickSort Funktion. Visar i detta exemplet hur man sorterar en array av strängar oce en med tal: MacGyver: Stort Tack! Jag rekomenderar dig att använda QuickSort metoden om du ska ha en som är snabb.. Det finns däremot en snabbare variant..Sortera en sträng ?
Jag får en sträng som jag vill sortera om i stigande ordning innan jag delar upp den och använder värdena.
Min sträng (StrSlidesOrdered) ger mig siffror med separatorn ,
Exempel: (12435, 1232, 1545, 54234, 26011, 24344)
Dessa vill jag sortera om i nummer ordning.
Sedan kör jag split och tar hand om värdena...
typ,
Dim arrSlideCollection, iSlide
arrSlideCollection = Split(StrSlidesOrdered, ",", -1, 1)
For Each iSlide in arrSlideCollection
Response.Write (strSlide)
Response.Write "<br>"
Eller är det lättare att sortera efter jag splittat värdena ??
Tacksam för svar eller hjälp på vägen...
/TommySv: Sortera en sträng ?
Det finns ingen inbygd sorteringsfunktion för arrayer i ASP/VBScript, så
man får göra en egen. Något i stil med:
<code>
Sub BubbleSort(ByRef a)
Dim vTmp
Dim i, j, n
n = UBound(a)
' börja sortera
For i = 0 To n
For j = 0 To i
' kolla om talen ska byta plats
If a(i) < a(j) Then
vTmp = a(i)
a(i) = a(j)
a(j) = vTmp
End If
Next
Next
End Sub
</code>
Funktionen ovan sorterar en array med tal.
Använd den med:
<code>
Call BubbleSort(arrSlideCollection)
</code>
Det bör väl nämnas att denna sorteringsalgoritm inte är speciellt snabb på stora arrayer, men fungerar bra vid mindre. Hoppas du fick lite hjälp.Sv: Sortera en sträng ?
Sv: Sortera en sträng ?
Den hjälpte mig långt på vägen.
Den fungerar nästan helt perfekt till och med.
Bara ett problem....
Den första posten i Arrayen, kommer alltid sist sedan när jag sorterat den och skrivit ut den... :-o
Så här ser det ut, med din kod.
Sub BubbleSort(ByRef a)
Dim vTmp
Dim i, j, n
n = UBound(a)
' börja sortera
For i = 0 To n
For j = 0 To i
' kolla om talen ska byta plats
If a(i) < a(j) Then
vTmp = a(i)
a(i) = a(j)
a(j) = vTmp
End If
Next
Next
End Sub
Dim arrSlideCollection, iSlide
arrSlideCollection = Split(StrSlidesOrdered, ",", -1, 1)
'Sortera bilderna i nummerordning
Call BubbleSort(arrSlideCollection)
For Each iSlide in arrSlideCollection
Response.Write (strSlide)
Response.Write "<br>"
StrSlidesOrdered kan till exempel innehålla
(18345,21300, 19000, 123, 4321)
Nu skrivs de ut:
123
4321
19000
21300
18345
Vilket är en riktigt bra bit på vägen.... :-)
Är ny på ASP så jag har lite svårt att hitta varför den inte flyttar första posten rätt.
*suck*
/TommySv: Sortera en sträng ?
Byt:
<code>
' kolla om talen ska byta plats
If a(i) < a(j) Then
</code>
Mot:
<code>
' kolla om talen ska byta plats
If CLng(a(i)) < CLng(a(j)) Then
</code>
Du kan testa att skriva
<code>
Response.Write Join(arrSlideCollection, "<br>")
</code>
direkt efter sorteringen för att se om det blivit rätt så långt.Sv: Sortera en sträng ?
<code>
<%
Option Explicit
Sub QuickSort(Data, lower, upper)
Dim pivot, temp
Dim first, last, middle
first = lower
last = upper
middle = (first + last) / 2
pivot = Data(middle)
Do
While Data(first) < pivot
first = first + 1
Wend
While Data(last) > pivot
last = last - 1
Wend
If first <= last Then
temp = Data(first)
Data(first) = Data(last)
Data(last) = temp
first = first + 1
last = last - 1
End If
Loop Until first > last
If lower < last Then
Call QuickSort(Data, lower, last)
End If
If first < upper Then
Call QuickSort(Data, first, upper)
End If
End Sub
Dim Data
Dim first
Dim last
Dim Index
Data = Array("b","d","a","e","c")
first = LBound(Data)
last = UBound(Data)
QuickSort Data, first, last
Response.Write Join(Data,"<BR>" & vbCrLf) & vbCrLf & vbCrLf
Data = Split("20;9;100;4;46;70",";")
first = LBound(Data)
last = UBound(Data)
For Index = first To last
Data(Index) = CDbl(Data(Index))
Next
QuickSort Data, first, last
Response.Write Join(Data,"<BR>" & vbCrLf)
%>
</code>Sv: Sortera en sträng ?
Fungerar helt perfekt för mig nu!
Nu har jag dessutom läst på lite, så nu vet jag varför det inte funkade i första läget..
:-)
Tack Andreas för din variant. Skall kika på den och försöka förstå vad den gör, och vad som skiljer de åt...
Tack!
/Tommy - på väg mot nya kul ASP projekt i takt med att kunskaperna ökar!Sv: Sortera en sträng ?
Du kan ju kika på den här sidan, där finns den en bunt med sorterings algoritmer och där kan du även se hur snabba dom är..
http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html
Koden är däremot skiven i Java, men det är inga större problem att skriva om det till VB eftersom det "bara" är en algoritm och inte många interna funktioner i Java som används!
MVH
//Jonas