Italian Ordinare lista per punteggio

SalentoFC

Member
Licensed User
Longtime User
Mi servirebbe un aiutino. Ho una lista di 5 campi uniti con stringbuilder con append e la stringa inizia con valori numerici. Ora se tento di ordinare la lista usando il comando sort (false ) l'ordine avviene considerando tutto stringa. Vedasi allegato. Le posizioni 18 e 19 dovrebbero stare sotto alla 20 poiché valore punteggio più piccolo invece no.
come posso fare? Grazie.
 

SalentoFC

Member
Licensed User
Longtime User
On penso che bisogna ordinare tutti gli elementi a mano con dei cicli for ehh..
 

LucaMs

Expert
Licensed User
Longtime User
Ecco, è comparso da poco il nuovo thread, immagino (a volte il sito non informa tempestivamente).

Di certo qui ci capiamo meglio.

Purtroppo non penso che tu possa ordinare la lista in quel modo.

Sarebbe tutto da fare in altro modo, perché avevamo iniziato dicendo:

salvo un db su un server FTP e poi...
e poi siamo rimasti fregatucci perché sembrava ritornare vuoto (devo ancora guardare di risolvere questo problema).

Dopodiché sembra che tu non ti stia più preoccupando di questo aspetto, ma solo di quello locale, sul dispositivo.

Se è così, sarebbe davvero il caso di usare un DB SQlite, ti renderebbe la vita molto più semplice e tutto sarebbe più ordinato.

Comunque, visto che sei a questo punto e ti manca solo questo passaggio, l'ordinamento, direi che la soluzione è complicata e contorta, ma per il momento non me ne vengono in mente altre... ecco, hai scritto un post, quindi proseguo nel prossimo per farti capire che ci sono ;)
 

LucaMs

Expert
Licensed User
Longtime User
Dunque, ripeto, soluzione contorta perché si sarebbe dovuto fare in altro modo.

Il modo migliore (nella tua situazione!) sarebbe usare una routine di ordinamento, tipo Quick Sort, non so se ce ne siano già pronte sul sito.
A questa tu dovresti passare un array con i soli punteggi, la routine ti dovrebbe restituire un array di numeri interi che facciano da puntatore agli elementi della list che contiene le righe con i 5 campi.

Cmq... "mumble mumble", penso mentre scrivo...

Allora...

copi i soli punteggi in una list (devi pero aggiungerli con un riempimento di zeri davanti: cioè, se il punteggio massimo è ad esempio 9999 e un punteggio è 345, nella lista dovresti mettere "0345").

Poi ordini questa lista semplicemente con il suo metodo Sort.

A questo punto potresti riordinare la lista originale (eventualmente ti dico come) oppure, quando devi caricarla in una ListView o altro, puoi fare così:

For I = 0 to lstPunteggiOrdinati.Size - 1
for j = 0 to lstOriginale.size -1
if lstOriginale.Get(j).StartsWith(lstPunteggiOrdinati.Get(i)) & ",") then
ListView1.Add... lstOriginale.Get(j)
exit for
end if
next
next

Non è il massimo ma dovrebbe funzionare.
 

LucaMs

Expert
Licensed User
Longtime User
Prova così (io l'ho scritto ma non provato!):

B4X:
Sub booo

    ' qui tu userai la tua lista con i dati, non una vuota come questa!
    Dim Persons As List : Persons.initialize
  
    Dim lstPunteggi As List : lstPunteggi.Initialize
  
    Dim Punteggio As String
    For i = 0 To Persons.Size - 1
        Punteggio = Regex.Split(",", Persons.Get(i))(0) ' se punteggio è il primo campo 0, altrimenti cambialo
        lstPunteggi.Add(ZeriIniziali(Punteggio, 7) ' ho messo 7 per punteggi fino a 9.999.999
    Next
    Dim Index() As Int = BubbleSort(lstPunteggi)

    ' a questo punto tu avrai un Index che punta ai dati ordinati
    For i = 0 To Persons.Size -1
        Log(Persons.Get(Index(i)))
    Next

End Sub

Sub BubbleSort(lst As List) As Int()
    Dim Index(lst.Size) As Int
    For i = 0 To lst.Size - 1
        Index(i) = i
    Next
  
    Dim swapped As Boolean
    Dim Buffer As Int
  
    swapped = True
    Do While swapped
        swapped = False
        For i = 1 To lst.Size - 1
            If lst.Get(Index(i - 1)) > lst.Get(Index(i)) Then
                Buffer = Index(i-1)
                Index(i-1) = Index(i)
                Index(i) = Buffer
                swapped = True
            End If
        Next
    Loop

    Return Index
End Sub

Sub ZeriIniziali(Num As String, Lungh As Int) As String
    Dim ret As String
    ret = Num
    For i= 1 To Lungh - ret.Length
        ret = "0" & ret
    Next
    Return ret
End Sub
 
Last edited:

SalentoFC

Member
Licensed User
Longtime User
Ora sembra funzionare. Ho inserito una funzione che come giustamente suggerivi tu aggiunge tanti zeri (ho ipotizzato al max 1000000 come valore) e nel visualizzare il punteggio semplicemente assegno ad una variabile intera il valore con gli zeri (es. 000028) che naturalmente, per la natura del tipo variabile, mostra in output il valore 28.
Ma lo spunto è stato tuo, così come il giusto merito! Grazie ancora!
 
Top