Toon posts:

[VB.NET] Sorteren van string array

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Het volgende is er gaande:

Ik heb een array wat bestaat uit regels uit een tekstfile (die heb ik dus ingelezen), dat ziet er als volgt uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*   *   222 *   *   2122    *   R       Vink    *   *   19820509    't Dorpje   23  F   1234OP  Oss *   *   *   1201    *   20030201    6800    710 

*   *   111 *   *   2125    *   T   de  Bruin   *   *   19820509    Berenlaan   12  A   8907CK  Vinkel  *   *   *   1201    *   20030701    -6800   12711   

*   *   111 *   *   2125    *   T   de  Bruin   *   *   19820509    Berenlaan   12  A   8907CK  Vinkel  *   *   *   1201    *   20030501    6800    12711   

*   *   333 *   *   2127    *   H       Ewijk   *   *   19820509    AanZeeStraat    278     5678LO  Best    *   *   *   1201    *   20030201    6800    12711   

*   *   111 *   *   2129    *   Upke    van Dupke   *   *   19820509    UpkeDupkelaan   90  A   9000OR  Upke    *   *   *   1201    *   20030301    -6800   12711   

*   *   111 *   *   2129    *   Upke    van Dupke   *   *   19820509    UpkeDupkelaan   90  A   9000OR  Upke    *   *   *   1203    *   20030301    6800    12711   

*   *   111 *   *   2134    *   JW      Somers  *   *   19820509    Wintersweg  45  B   0000OO  Getijde *   *   *   1202    *   20030211    6800    12712   

*   *   111 *   *   2136    *   Oma     Grutje  *   *   19820509    Ouwelulleweg    84  A   5467OL  Oss *   *   *   1203    *   20030211    -6800   12712   

*   *   111 *   *   2137    *   Opa     Grutje  *   *   19820509    Ouwelulleweg    84  B   5467OL  Oss *   *   *   1201    *   20030301    6800    12712

Iedere nieuwe regel is dus een item in de array, nu wil ik deze array gaan sorteren.

Sorteren is op zich niet het probleem, maar omdat het hier om een string gaat, en ik wil gaan sorteren op een nummer dat in die string staat, word het al wat lastiger.
Hiervoor heb ik zelf al wat bedacht, namelijk ik ga van iedere regel in de betreffende array een object aanmaken. Dit object bevat dan van bijvoorbeeld item 1, alle TAB gescheiden waardes.
Dan maak ik een nieuwe array aan van dit object, en dan defineer ik zelf een IComparer, die dan sorteert op betreffende nummer!

MAAR eigenlijk wil ik niet sorteren op EEN getal, maar op TWEE getallen. Ik heb geen idee hoe ik dat zou moeten doen dan.


Eerst was het zo dat de tekstfile gesorteerd aangelevert werd, maar nu niet meer. Oftewel ik moet mijn inlees klasse gaan herschrijven.
Voordat ik ging aanpassen, ging het als volgt:

- bestand werd ingelezen, en iedere regel werd in een array geplaatst.
- De klasse bevat functies die bijhoudt welke de huidige regel, vorige regel, etc.
- In een andere klasse vraag ik aan de inlees klasse, een regel op (deze regel is een string en is TAB gescheiden)
- deze regel split ik dan weer in een nieuwe array, en aan de hand hiervan maak ik dan weer andere klasses aan zoals:
debiteur
factuurOpdracht
factuurRegel
- en dat was het dan, globaal gezien.

Nu is er dus het probleem dat de file niet meer gesorteerd is, en dat moet dus gebeuren voordat er andere klasses worden aangemaakt.
Maar op bovenstaande manier krijg ik dus een array van objecten, die gesorteerd worden (als ik weet hoe je op 2 getallen kan sorteren), maar dan ben ik er nog niet. Want de inlees klasse moet een TAB gescheiden string retourneren, ipv. een object. Oftewel dan zou ik de objecten array die gesorteerd zijn, weer moeten gaan plaatsen in een string array.

Nu vraag ik me af of dit wel de juiste manier is, en er geen makkelijker/snellere manier is.

Ik hoop dat men mij kan helpen, als er iets niet duidelijk is of je moet weer gegevens hebben? Just ask!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Kan je niet een eigen class maken, ipv in een array zetten, en deze sorteren door IComparer te implementeren?

Gebruik, ipv een array, een datatable. Deze zijnw at makkelijker te sorteren.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 31 oktober 2003 @ 10:20:
Kan je niet een eigen class maken, ipv in een array zetten, en deze sorteren door IComparer te implementeren?

Gebruik, ipv een array, een datatable. Deze zijnw at makkelijker te sorteren.
OK, ik wou net gaan vertellen dat ik dit dus al gedaan heb! :D

SChematisch UML klassediagram (gedeelte althans):

Bestand -----------> Regel
|
|
|
|
|
V
Main

Bestand bevat een arrayList van Regel Objecten, en Regel bevat de items van EEN regel uit de Textfile.

In bestand sorteer ik de arrayList van Regels, en Bestand bevat methode om Regels op te vragen.

Dus dat probleem is ook weer opgelost, alleen dan zit ik nog met de vraag hoe ik op TWEE properties van het object Regel kan sorteren?

Ik weet dat dat gaat via een IComparer, maar ik weet niet hoe dat gaat met sorteren op twee waardes!

Ik heb de code om te sorteren op EEN waarde, namelijk:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Class myComparer : Implements IComparer

    Public Function CompareTo(ByVal x As Object, ByVal y As Object) As Integer _
      Implements IComparer.Compare

        If Not (TypeOf x Is Regel And TypeOf y Is Regel) Then
            Throw New ArgumentException _
            ("The objects to compare must be of type 'Regel'")
        End If

        Dim tempObj1 As String = CType(x, Regel).debiteurID
        Dim tempObj2 As String = CType(y, Regel).debiteurID

        CompareTo = tempObj1.ToString().CompareTo(tempObj2.ToString())
    End Function
End Class


Maar deze sorteert dus ALLEEN op debiteurID, en ik wil ook nog sorteren op verzekeraar! ?

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Heel tweaker-onwaardige oplossing misschien, maar wel praktisch.

Kan je dit bestand niet inlezen in Excel, met als scheidingsteken... (timmermansoog) drie spaties? Sorteren is dan een eitje.

[ Voor 8% gewijzigd door Varienaja op 31-10-2003 11:09 ]

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
Varienaja schreef op 31 oktober 2003 @ 11:08:
Heel tweaker-onwaardige oplossing misschien, maar wel praktisch.

Kan je dit bestand niet inlezen in Excel, met als scheidingsteken... (timmermansoog) drie spaties? Sorteren is dan een eitje.
Nee, dit is geen optie! Ik moet echt de code hebben om op meerdere getallen te kunnen sorteren van een object!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Je weet dat IComparer.Compare een integer teruggeeft; -1, 0 of 1 (althans, dit is voldoende). Je zou je in je IComparer kunnen controleren of Property A1 < Property B1 en Property A2 < Property B2, dan return je -1, etc.

Echter, ik vraag me af waarom je geen datatable gebruikt.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
gorgi_19 schreef op 31 oktober 2003 @ 18:39:
Je weet dat IComparer.Compare een integer teruggeeft; -1, 0 of 1 (althans, dit is voldoende). Je zou je in je IComparer kunnen controleren of Property A1 < Property B1 en Property A2 < Property B2, dan return je -1, etc.

Echter, ik vraag me af waarom je geen datatable gebruikt.
De reden dat ik geen dataTable gebruik is, omdat ik niet eens wist dat die dingen bestonden ! :+

Maar ik heb het nu als volgt opgelost:

De klasse Regel, die dus alle regels bevat met hun waardes, maar in het bijzonder het debiteurenID en het verzekeraarsID.
Nu heb ik nog een extra propertie genaamd "sleutel", deze ken ik een waarde toe. Deze waarde bestaat uit een debiteurenID en een verzekeraarsID (samengevoegd dus). Dat doe ik mbv. de volgende code:

Visual Basic .NET:
1
2
3
4
5
6
Public ReadOnly Property sleutel() As String
        Get
            Return Format(CType(m_Verzekeraar, Integer), "0000") _ 
                   & Format(CType(m_DebID, Long), "00000000")
        End Get
    End Property


En dan sorteer ik hier op, met de volgende code:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
   Public Function CompareTo(ByVal x As Object, ByVal y As Object) As Integer _
      Implements IComparer.Compare

        If Not (TypeOf x Is Regel And TypeOf y Is Regel) Then
            Throw New ArgumentException _
            ("The objects to compare must be of type 'Regel'")
        End If

        Dim tempObj1 As String = CType(x, Regel).sleutel
        Dim tempObj2 As String = CType(y, Regel).sleutel

        CompareTo = tempObj1.ToString().CompareTo(tempObj2.ToString())
    End Function


Werkt als een trein, en heb het ook nog eens helemaal zelf bedacht ! ;)
Pagina: 1