Android Question Sorting List of Classes

Loris Anoardi

Member
Licensed User
Longtime User
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
 

Attachments

  • Variante.bas
    665 bytes · Views: 144
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Il problema è che, essendo variabili oggetto, quando fai lo scambio, succede un macello :D
--- 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
 
Upvote 0

LucaMs

Expert
Licensed User
Longtime User
Si, ottimo, non lo conoscevo!

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.
 
Upvote 0
Top