sort functie

Status
Niet open voor verdere reacties.

dejobse

Gebruiker
Lid geworden
7 jul 2008
Berichten
722
hallo,

ik heb een probleempje(alweer) met de sort functie in vb.net...
dus, van 80 4 40 1 65 6 moet worden, 1 4 6 40 65 80 maar het wordt 1 4 40 6 65 80.
heeft iemand een idee wat hier fout is?
ik heb heel het web afgezocht maar kan alleen mijn code terugvinden

array.sort(naamvandearray)

dus hij sorteert alleen op het eerste cijfer, dit moet op alle cijfers zijn..

alvast bedankt!
 
Van welk type is de Array? Als deze van het type Integer is (of een getal type) zou het geen probleem moeten zijn. Maar wanneer je bijv. een string array probeert te sorteren gaat het inderdaad mis.

Je kan deze functie gebruiken, maar ik vermoed dat er een betere manier is.

De functie:
PHP:
    Private Function SorteerStringNummerArray(ByVal DeArray() As String) As String()
        For a As Integer = 0 To DeArray.Length - 1
            For i As Integer = 0 To DeArray.Length - 2
                If CInt(DeArray(i)) > CInt(DeArray(i + 1)) Then
                    Dim Temp As String = DeArray(i + 1)
                    DeArray(i + 1) = DeArray(i)
                    DeArray(i) = Temp
                End If
            Next
        Next
        Return DeArray
    End Function

Dan roep je die zo aan:
PHP:
MijnArray = SorteerStringNummerArray(MijnArray)
 
Laatst bewerkt:
Toevallig heb ik een tijdje terug met hetzelfde probleem gezeten en hebben mijn oom en ik een hele avond besteed aan het vinden van een oplossing. Dit is em:

Om te beginnen plaats je deze methods:

Code:
    ''' <summary>Sort an array using the QuickSort algorithm (By Michael Ciurescu).</summary>
    ''' <param name="C">The array to sort.></param>
    ''' <param name="First">The lowest index of the array.</param>
    ''' <param name="Last">The highest index of the array or the length/count of the array.</param>
    Public Shared Sub QuickSort(ByVal C() As String, ByVal First As Long, ByVal Last As Long)
        Dim Low As Long, High As Long
        Dim MidValue As String

        Low = First
        High = Last
        MidValue = C((First + Last) \ 2)

        Do
            While MyComparer.StrCmpLogicalW(C(Low), MidValue) < 0
                Low = Low + 1
            End While

            While MyComparer.StrCmpLogicalW(C(High), MidValue) > 0
                High = High - 1
            End While

            If Low <= High Then
                Swap(C(Low), C(High))
                Low = Low + 1
                High = High - 1
            End If
        Loop While Low <= High

        If First < High Then QuickSort(C, First, High)
        If Low < Last Then QuickSort(C, Low, Last)
    End Sub

    Private Shared Sub Swap(ByRef A As String, ByRef B As String)
        Dim T As String
        T = A
        A = B
        B = T
    End Sub

En deze class:

Code:
Public Class MyComparer
    Implements IComparer(Of String)
    Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" (ByVal s1 As String, ByVal s2 As String) As Int32
    Private Function Compare(ByVal x As String, ByVal y As String) As Integer _
        Implements System.Collections.Generic.IComparer(Of String).Compare
        Return StrCmpLogicalW(x, y)
    End Function
End Class

Het aanroepen gaat zo:

Code:
        Dim K As Long
        QuickSort(naamvandearray, LBound(naamvandearray), UBound(naamvandearray))
        For K = LBound(naamvandearray) To UBound(naamvandearray)
            MessageBox.Show(naamvandearray(K))
        Next
 
Laatst bewerkt:
En je kan het ook zo doen:

PHP:
    Private Function SorteerArray(ByVal A() As String) As String()
        Dim B() As Integer = Array.ConvertAll(A, New Converter(Of String, Integer)(AddressOf Convert.ToInt32))
        Array.Sort(B)
        Return Array.ConvertAll(B, New Converter(Of Integer, String)(AddressOf Convert.ToString))
    End Function

Aanroepen doe je zo:

PHP:
        Dim A() As String = {"123", "1930", "89", "15", "100", "2"}
        A = SorteerArray(A)

Resultaat:

SmBLJ.png


Minder code en werkt prima.
 
Laatst bewerkt:
Ja hoor...

Zijn mn oom een ik een hele avond bezig geweest om vervolgens met die lap code te komen, kom jij effe gezellig een piepkleine functie posten dat precies hetzelfde doet! :D
// Facepalm
 
HUHHH, raar, ik voer het nogis uit gewoon met de code array.sort(dearray) en het werkt :s
is dit dan een eve goede oplossing als die van Captainbri? of kan ik beter die gebruiken?
als die van captainbri beter is, zou je die dan ook willen uitleggen?

al heel hard bedankt!
 
Functie naam & parameter
PHP:
Private Function SorteerArray(ByVal A() As String) As String()
De string array nemen en hem helemaal converteren naar een nieuwe integer array
PHP:
Dim B() As Integer = Array.ConvertAll(A, New Converter(Of String, Integer)(AddressOf Convert.ToInt32))
De integer array sorteren
PHP:
Array.Sort(B)
Een nieuwe array terug geven als string array, geconverteerd vanuit de integer array --> string array.
Dus hij converteert eerst de integer array naar een string array, daarna ''returnt'' hij deze. (geeft weer terug)
Return Array.ConvertAll(B, New Converter(Of Integer, String)(AddressOf Convert.ToString))
End Function

Kijk, als je deze cijfers zou sorteren:
PHP:
Dim A() As String = {"150", "8", "20"}

Zou je dit krijgen:

ZtJJC.png


Met mijn functie krijg je dit:

pnS9t.png




En het kan goed zijn dat de Array.Sort functie ineens wel werkt, omdat je bijv. getallen gebruikt onder de tien, zie hier:

Code die uitgevoerd word:
PHP:
Dim A() As String = {"5", "2", "4"}
Array.Sort(A)

Resultaat:

VkHuP.png


Duss, lijkt me slimmer om mijn functie te gebruiken :)
 
Laatst bewerkt:
nee... hij werkt echt bij alles,
30swyfa.png
 
Laatst bewerkt:
Vreemd. Ik vermoed dat je array een Integer array is, daarom werkt het natuurlijk wel.

:confused:

Dus, nog eens mijn eerste vraag (zie hieronder), deze keer a.u.b. wel even beantwoorden :)

Van welk type is de Array? Als deze van het type Integer is (of een getal type) zou het geen probleem moeten zijn. Maar wanneer je bijv. een string array probeert te sorteren gaat het mis.

Of nouja, ik zie dat het in ieder geval geen string array is.. Misschien had je dat even kunnen vermelden..
 
Laatst bewerkt:
aha, jha jha het is integer, sorry dat ik niet antwoorden... had je vraag niet gezien.. maar ik heb de functie opgeslagen voor het geval ik ooit een string array moet sorteren ;) heel hard bedankt!
 
En als je nou een array hebt met deze inhoud?:

010
002
101
...etc
001
100
011
...etc
099
009
003
...etc
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan