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.
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:
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