I wrote this code for sorting a list of classes Variante by the field Variante.Descrizione
After sorting the list gblVarianti isn't sorted!
Someone can help me?
In attach, the class Variante.
Thanks in advance,
Loris
B4X:
Public gblVarianti As List
...
Private Sub SortVarianti()
Dim n As Int, i As Int, j As Int
n = gblVarianti.Size - 1
Dim V1 As Variante
Dim V2 As Variante
Dim Vtemp As Variante
For i = (n - 1) To 0 Step -1
For j = 0 To i
V1 = gblVarianti.Get(j)
V2 = gblVarianti.Get(j + 1)
If V1.Descrizione.CompareTo(V2.Descrizione) > 0 Then
Vtemp = V2
V2 = V1
V1 = Vtemp
End If
Next
Next
End Sub
Il problema è che, essendo variabili oggetto, quando fai lo scambio, succede un macello
--- The problem is that they are objects, then the swap creates problems.
Ti conviene mettere tutte le descrizioni in un array, creare un array indice (di interi o long); quando effettui il controllo e lo scambio, utilizzi gli indici.
--- You could put all the descriptions in an array, create an index array (of int or long); when you do the comparison and the swap, use the index array.
B4X:
Sub SortVarianti ' BubbleSort
Private NumElem As Long = gblVarianti.Size
Private Descr(NumElem) As String
Private Idx(NumElem) As Long
Private var As Variante
For i = 0 To NumElem - 1
var = gblVarianti.Get(i)
Descr(i) = var.Descrizione
Idx(i) = i
Next
Dim swapped As Boolean
Dim tmpIdx As Long
swapped = True
Do While swapped
swapped = False
For i = 1 To NumElem - 1
If Descr(Idx(i - 1)).CompareTo(Descr(Idx(i))) > 0 Then
tmpIdx = Idx(i - 1)
Idx(i - 1) = Idx(i)
Idx(i) = tmpIdx
swapped = True
End If
Next
Loop
' Qui tu hai un indice che punta alla lista ordinata,
' che puoi utilizzare direttamente sulla lista, oppure
' modificare la lista in base all'indice.
' --- The index array points to the ordered objects of the list.
For i = 0 To NumElem - 1
Log(Descr(Idx(i)))
Next
End Sub
Please use [ code ] [ /code ] tags (without spaces) when posting code.
You can sort custom Types with List.SortType. A possible solution for sorting class instances is to first convert each instance to a type and add it to a List. You can then call List.SortType to sort the list.
Ha ovviamente il difettuccio che un tipo non è una classe; come sai, in una classe non hai solo proprietà, ma anche metodi, compresi quelli per la validazione dei campi.
La soluzione in assoluto migliore è utilizzare i db. Dato che gli oggetti ricavati dalle classi di solito da qualche parte dovrai pure salvarli, mettendoli in un db poi usi le query per l'ordinamento.