Table of Contents

7.4.9.4 Project - Sorting a derived array

Sorting a derived array has already been described in? chapter 7.4.9.3. The serious disadvantage of the sorting described in this chapter is that you have to specify the field to be sorted by in the program. This chapter introduces a solution for sorting a derived array, which allows you to dynamically define the field by which the object array is sorted. All the explanations in –> chapter 7.4.9.3 also apply to this project, especially the details of the _compare() method. The class CDS is supplemented in the project by some variables and a property.

7.4.9.4.1 Class definition

The array to be sorted aCDSArray is, as in –> chapter 7.4.9.3, a one-dimensional, derived array whose elements are objects of a self-written class CDS. The array type is therefore CDS[] or Object[].

File CDS. class:

[1] ' Gambas class file
[2]
[3] Public JGS As Integer
[4] Public BirthDate As Date
[5] Public FirstName As String
[6] Public Surname As String
[7] Public Latin As Boolean
[8] Public Course1 As String
[9] Public Course2 As String
[10]
[11] Public Function _compare(DS As CDS) As Integer
[12]
[13]   Select Case $SortField
[14]   Case 1
[15]     Return Sgn(JGS - DS.JGS) ' Number
[16]   Case 2
[17]      Return - Sgn(DateDiff(BirthDate, DS.BirthDate, gb.Second)) ' Date
[18]   Case 3
[19]     Return Comp(Firstname, DS.Firstname) ' String
[20]   Case 4
[21]     Return Comp(Surname, DS.Surname)
[22]   Case 5
[23]     Return IIf(Latin, IIf(DS.Latin, 0, 1), IIf(DS.Latin, -1, 0)) ' Truth value
[24]   Case 6
[25]     Return Comp(Course1, DS.Course1)
[26]   Case 7
[27]     Return Comp(Course2, DS.Course2)
[28]    Default
[29]       Error.Raise(("No sort method found!"))
[30]   End Select
[31]
[32] End
[33]
[34] Private $SortField As Integer
[35] Property SortField As Integer
[36]
[37] Private Function SortField_Read() As Integer
[38]   Return $SortField
[39] End
[40]
[41] Private Sub SortField_Write(NewValue As Integer)
[42]   If NewValue < 1 Or NewValue > 7 Then
[43]      Error.Raise(("Input error! Input only from[1..7]."))
[44]   Else
[45]     $SortField = NewValue
[46]   Endif
[47] End

The structure of the elements in the derived array aCDSArray becomes particularly clear in the project when you create a new element of the CDS array, fill it with data and insert it into the array:

hCDS = New CDS
  hCDS.JGS = 11
  hCDS.BirthDate = Date(Year(Now()) - 17, 12, 13)
  hCDS.Firstname = "Gerd"
  hCDS.Surname = "Vulutre"
  hCDS.Latin = True
  hCDS.Course1 = "Social Studies"
  hCDS.Course2 = "Chemistry"
aCDSArray.Add(hCDS)

For an array with 6 elements of type CDS, for example, the following (formatted) display of the array in the console of the IDE consists of 6 rows and 7 (fictitious) columns or fields:

11      22.08.1996      Doris   Fox      True    Biology         German
12      18.08.1997      Anna    Cat      False   Mathematics     English
11      17.06.1996      Maria   Zebra    False   Informatics     German
12      02.05.1997      Anna    Owl      False   Astronomy       Art
12      27.04.1996      Fred    Badger   False   Astronomy       German
11      13.12.1997      Gerd    Vulture  True    Social Studies  Chemistry

The following requirements are required for sorting the derived array:

7.4.9.4.4.2 Approach to the implementation of claims

Instead of the possible array class CDS[] - which would be created automatically by the interpreter and thus have all properties and methods of an array - the class Object[] is used in the project. This is possible because all elements of the array to be sorted are objects of the class CDS. To eliminate the disadvantage of being able to specify only statically the field to be sorted by, the class Object[] is extended by a method to sort multi-dimensionally. Benoît Minisini points out that you cannot directly overwrite the class Object[] because '[' and']' are not allowed in project filenames. He therefore suggests that all methods and properties of the class Object[] are inherited in a new class via Inherits Object[] and enhancements are implemented there. At all points in the project, the new class replaces the class Object[].

The source code of the new class CDSArray in the file CDSArray. class is easy to review:

[1] ' Gambas class file
[2]
[3] Inherits Object[]
[4]
[5] Public Sub SortNew(Field As Integer, Optional Mode As Integer)
[6]   Dim iIndex As Integer
[7]
[8]   If Super.Count = 0 Then Return
[9]
[10]   For iIndex = 0 To Super.Count - 1
[11]     Super[iIndex].SortField = Field
[12]   Next
[13]
[14]   Super.Sort(Mode)
[15]
[16] End

Comments:

What has been achieved so far?

On the one hand, the class CDS is available to you as a data container with _compare () method and the property SortField, and on the other hand, the new class CDSArray, which overwrites the class Object[] and provides a method in the SortNew () method, in which you can use the property SortField to specify the field according to which you want to sort and optionally the sort sequence.

The two classes CDS and CDSArray are used in the main program. An array aCDSArray of the class CDSArray is generated, filled with data in different ways and sorted according to a freely selectable field, and the contents of the original and sorted array are displayed:

' Gambas class file
 
Public aCDSArray As CDSArray
Public iAsDescent As Integer = 0
 
Public Sub Form_Open()
  FMain.Center
  FMain.Resizable = False
  rbtnAscent.Value = True
  rbtnAscent.SetFocus
End ' Form_Open()
 
Public Sub btnClassArray_Click()
  Dim iCount As Integer
  Dim hCDS As CDS
  Dim aNames As String[] = ["Eagle", "Bear", "Badger", "Fox", "Tit", "Owl", "Zebra"]
  Dim aSurNames As String[] = ["Anna", "Bruno", "Doris", "Fred", "Maria", "Klaus", "Udo"]
  Dim aCourses1 As String[] = ["Mathematics", "History", "Astronomy", "Biology", "Informatics"]
  Dim aCourses2 As String[] = ["German", "Physics", "English", "Art", "Music"]
 
  aCDSArray = New CDSArray
 
  Randomize
 
  For iCount = 0 To 4
    hCDS = New CDS
      hCDS.JGS = CInt(Rnd(11, 13)) ' 11..12
    ' Random date: Year: matching JGS, Month: 1..12, Tag: 1..28 (this always fits...)
      hCDS.BirthDate = Date(Int(Rnd(Year(Now()) - 18, Year(Now()) - 16)), Int(Rnd(1, 13)), Int(Rnd(1, 29)))
      hCDS.Firstname = aSurNames[Int(Rnd(0, aSurNames.Count))]
      hCDS.Surname = aNames[Int(Rnd(0, aNames.Count))]
      hCDS.Latin = CBool(Round(Rnd(0, 1)))
      hCDS.Course1 = aCourses1[Int(Rnd(0, aCourses1.Count))]
      hCDS.Course2 = aCourses2[Int(Rnd(0, aCourses2.Count))]
 
      aCDSArray.Add(hCDS)
 
  Next ' iCount
 
  hCDS = New CDS        ' Generate a new but empty array element of object type CDS...
  aCDSArray.Add(hCDS)   ' ... and paste it into the array
' Overwrite the last array element with the following data:
  aCDSArray[aCDSArray.Max].JGS = 11
  aCDSArray[aCDSArray.Max].BirthDate = Date(Year(Now()) - 17, 12, 13)
  aCDSArray[aCDSArray.Max].Firstname = "Gerd"
  aCDSArray[aCDSArray.Max].Surname = "Volture"
  aCDSArray[aCDSArray.Max].Latin = True
  aCDSArray[aCDSArray.Max].Course = "Social Studies"
  aCDSArray[aCDSArray.Max].Course2 = "Chemistry"
 
' Display all records
  ShowCDSArrayElements(aCDSArray)
' Sortierung Array:
' First parameter: Field number of the field to be sorted by (SpinBox)
' 2nd parameter: Determination of the sorting order (optional) (RadioButton)
 
  aCDSArray.SortNew(spinBox.Value, iAsDescent) ' → Field 4 (Surname), descending (Z..a)
 
  ShowCDSArrayElements(aCDSArray)
 
End ' btnClassArray_Click()
 
Private Sub ShowCDSArrayElements(aArray As CDSArray)
  Dim hCDS As CDS
  Dim i As Integer
 
' Display of all data sets (Console of the IDE)
  For Each hCDS In aArray
    Print hCDS.JGS,
    Print Format(hCDS.BirthDate, "dd.mm.yyyy"),
    Print hCDS.Firstname,
    Print hCDS.Surname,
    Print hCDS.Latin,
    Print hCDS.Course1,
    Print hCDS.Course2
  Next ' hCDS
 
' Variante 2
' For i = 0 To aArray.Max
'   Print aArray[i].JGS,
'   Print Format(aArray[i].BirthDate, "dd.mm.yyyy"),
'   Print aArray[i].Firstname,
'   Print aArray[i].Surname,
'   Print aArray[i].Latin,
'   Print aArray[i].Course1,
'   Print aArray[i].Course2
' Next
' Print
 
End ' ShowCDSArrayElements(aArray As ObjectSort)
 
Public Sub rbtnAscent_Click()
  iAsDescent = gb.Ascent
End ' rbtnAscent_Click()
 
Public Sub rbtnDescent_Click()
  iAsDescent = gb.Descent
End ' rbtnDescent_Click()

Output of the original and sorted array - sorted by surname (descending) - in the console of the IDE:

11      22.08.1996      Doris   Fox      True    Biology         German
12      18.08.1997      Anna    Cat      False   Mathematics     English
11      17.06.1996      Maria   Zebra    False   Informatics     German
12      02.05.1997      Anna    Owl      False   Astronomy       Art
12      27.04.1996      Fred    Badger   False   Astronomy       German
11      13.12.1997      Gerd    Vulture  True    Social Studies  Chemistry
11      17.06.1996      Maria   Zebra    False   Informatics      German
12      02.05.1997      Anna    Owl      False   Astronomy        Art
12      18.08.1997      Anna    Cat      False   Mathematics      English
11      13.12.1997      Gerd    Vulture  True    Social Studies   Chemistry
11      22.08.1996      Doris   Fox      True    Biology          German
12      27.04.1996      Fred    Badger   False   Astronomy        German

Download