Differenze tra le versioni di "Ordinare i valori all'interno di una colonna"

Da Gambas-it.org - Wikipedia.
(Nuova pagina: ==Ordinare valori numerici== Ipotizziamo di avere una ''GridView'' con 5 righe e 3 colonne. In una prima fase avremo nella prima colonna 5 numeri posti in modo "non ordinato" (li sceg...)
 
Riga 1: Riga 1:
==Ordinare valori numerici==
+
==Ordinare valori ''numerici''==
  
 
Ipotizziamo di avere una ''GridView'' con 5 righe e 3 colonne. In una prima fase avremo nella prima colonna 5 numeri posti in modo "non ordinato" (li sceglieremo casualmente per ottenere l'esempio). Successivamente, in quella colonna tali valori saranno inseriti e mostrati in modo "ordinato" crescente.
 
Ipotizziamo di avere una ''GridView'' con 5 righe e 3 colonne. In una prima fase avremo nella prima colonna 5 numeri posti in modo "non ordinato" (li sceglieremo casualmente per ottenere l'esempio). Successivamente, in quella colonna tali valori saranno inseriti e mostrati in modo "ordinato" crescente.
Riga 29: Riga 29:
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
 +
 +
==Ordinare valori ''stringa''==
 +
Possiamo ordinare all'interno delle colonne, come più in generale all'interno di un array, anche valori ''stringa''.
 +
 +
Private a As New String[]
 +
 +
 +
'''Public''' Sub Form_Open()
 +
 +
Dim j As Byte
 +
 +
<FONT color=#006400>' ''impostiamo 6 colonne e 3 righe alla GridView:''</font>
 +
  With GridView1
 +
    .Columns.Count = 6
 +
    .Rows.Count = 3
 +
  End With
 +
 +
 +
<FONT color=#006400>' ''Imponiamo una stringa in ciascuna delle tre celle della 1^ colonna:''</font>
 +
  For j = 0 to 2
 +
    With GridView1[j, 0]
 +
<FONT color=#006400>' '' coloriamo di verde la nostra colonna:''</font>
 +
      .Background = Color.Green
 +
<FONT color=#006400>' '' per "semplificare" l'esempio, mettiamo solo un carattere:''</font>
 +
      .Text = Chr(80 - j)
 +
    End With
 +
 +
<FONT color=#006400>' '' Inseriamo ciascun carattere in una variabile stringa array,
 +
' ''perché "solo così", potremo utilizzare una funzione di Gambas
 +
' ''per poter procedere al riordino dei caratteri.
 +
' ''Prendiamo quei caratteri *dall'interno di ciascuna cella* della colonna:''</font>
 +
    a.Add(GridView1[j, 0].Text)
 +
  Next
 +
 +
'''End'''
 +
 +
 +
'''Public''' Sub Button1_Click()
 +
 +
  Dim j As Byte
 +
 +
<FONT color=#006400>' ''Nonostante vi siano dei caratteri, è possibile effettuare anche
 +
' ''con essi al loro riordino ! Riordino che avverrà nel rispetto
 +
' ''della sequenza imposta nel protocollo ASCII. Provvediamo, dunque,
 +
' ''ad ordinare qui i caratteri in modo "ascendente" (dalla A alla Z):''</font>
 +
    a.Sort(gb.Ascent)
 +
 +
<FONT color=#006400>' ''Raggiungiamo così il nostro obiettivo finale di vedere "ordinati"
 +
' ''all'interno della 1^ colonna:''</font>
 +
    For j = 0 to 2
 +
      GridView1[j, 0].Text = a[j]
 +
    Next
 +
 +
'''End'''
 +
 +
 +
Tutto tranquillo se il primo carattere delle [u]stringhe[/u] (qualunque lunghezza esse abbiano) è una lettera dell'alfabeto; ma se dinnanzi alle lettere c'è una quantità di caratteri numerici diversa da una stringa rispetto ad un'altra, il comportamento della funzione, per effettuare il riordino, cambia !
 +
Infatti, se per esempio facciamo compiere il riordino ([u]ascendente[/u], come prima) di queste tre stringhe: "[i]55z[/i]", "[i]111p[/i]" e "[i]9a[/i]", il riordino prenderà in considerazione il [u]primo[/u] carattere sulla base del protocollo ASCII. In tal caso avremo questo riordino:
 +
[color=maroon]111p
 +
55z
 +
9a[/color]
 +
e [u]non[/u] il contrario, come ci aspetteremmo !
 +
 +
Per ovviare a questo inconveniente, uno stratagemma può essere quello di far aggiungere degli zero dinanzi al primo carattere, in maniera tale che ciascuna stringa iniziale, alla quale saranno stati aggiunti quegli zero, abbia [u]così[/u] lo [u]stesso numero di caratteri[/u] delle altre stringhe presenti nell'array. Prendendo le stringhe di prima, insomma dovremo per esempio avere:
 +
0111p
 +
0055z
 +
0009a
 +
 +
[code=gambas]
 +
Public Sub Button1_Click()
 +
 +
Dim j As Byte
 +
Dim s as string
 +
 +
  For j = 0 To 2
 +
    s = String$(5 - Len(GridView1[j, 0].Text), "0") & GridView1[j, 0].Text
 +
 +
' Carichiamo quelle stringhe così modificate nella variabile array:
 +
    a.Add(s)
 +
  Next
 
[/code]
 
[/code]
 +
 +
e procedendo quindi al riordino mediante il predetto metodo [i]variabile_Array.[color=maroon]Sort[/color][/i], riusciremo ad ottenere il riordino di quelle particolari stringhe; ed avremo la nuova disposizione degli elementi all'interno dell'array come segue:
 +
0009a
 +
0055z
 +
0111p
 +
 +
Successivamente elimineremo gli zero che abbiamo [i]strategicamente[/i] aggiunto:
 +
[code=gambas]
 +
For j = 0 To 2
 +
  a[j] = Replace(a[j], "0", "")
 +
Next
 +
[/code]
 +
 +
e ripiazziamo, così, nella 1[sup]a[/sup] colonna quelle tre stringhe, ri-ordinate e ripulite dagli zero che avevamo aggiunto:
 +
[code=gambas]
 +
  For j = 0 To 2
 +
      GridView1[j, 0].Text = a[j]
 +
    Next
 +
 +
End
 +
[/code]
 +
 +
ed il gioco è fatto:
 +
9a
 +
55z
 +
111p

Versione delle 06:04, 17 giu 2012

Ordinare valori numerici

Ipotizziamo di avere una GridView con 5 righe e 3 colonne. In una prima fase avremo nella prima colonna 5 numeri posti in modo "non ordinato" (li sceglieremo casualmente per ottenere l'esempio). Successivamente, in quella colonna tali valori saranno inseriti e mostrati in modo "ordinato" crescente.


Public Sub Form_Open()

Dim j, k As Byte
Dim a As New Byte[]

 With GridView1
   .Columns.Count = 3
   .Rows.Count = 5
 End With

For j = 0 To 4
  k = Rnd(1, 100)  ' li individuo casualmente per creare il nostro esempio
  a.Add(k)         ' li pongo in una variabile array
  Print a[j]       ' li vedo in console come individuati in modo casuale
Next
 
' provvedo a ordinarli in modo crescente:
 a.Sort(gb.Ascent)

' li piazzo nella 1^ colonna così come finalmente ordinati:
 For j = 0 To 4
  GridView1[j, 0].Text = a[j]
 Next

End


Ordinare valori stringa

Possiamo ordinare all'interno delle colonne, come più in generale all'interno di un array, anche valori stringa.

Private a As New String[]


Public Sub Form_Open()

Dim j As Byte

' impostiamo 6 colonne e 3 righe alla GridView:
 With GridView1
   .Columns.Count = 6
   .Rows.Count = 3
 End With


' Imponiamo una stringa in ciascuna delle tre celle della 1^ colonna:
  For j = 0 to 2
    With GridView1[j, 0]
'  coloriamo di verde la nostra colonna:
      .Background = Color.Green
'  per "semplificare" l'esempio, mettiamo solo un carattere:
      .Text = Chr(80 - j)
    End With

'  Inseriamo ciascun carattere in una variabile stringa array,
' perché "solo così", potremo utilizzare una funzione di Gambas
' per poter procedere al riordino dei caratteri.
' Prendiamo quei caratteri *dall'interno di ciascuna cella* della colonna:
    a.Add(GridView1[j, 0].Text)
  Next

End


Public Sub Button1_Click()

 Dim j As Byte

' Nonostante vi siano dei caratteri, è possibile effettuare anche
' con essi al loro riordino ! Riordino che avverrà nel rispetto
' della sequenza imposta nel protocollo ASCII. Provvediamo, dunque,
' ad ordinare qui i caratteri in modo "ascendente" (dalla A alla Z):
   a.Sort(gb.Ascent)

' Raggiungiamo così il nostro obiettivo finale di vedere "ordinati"
' all'interno della 1^ colonna:
   For j = 0 to 2
     GridView1[j, 0].Text = a[j]
   Next

End


Tutto tranquillo se il primo carattere delle [u]stringhe[/u] (qualunque lunghezza esse abbiano) è una lettera dell'alfabeto; ma se dinnanzi alle lettere c'è una quantità di caratteri numerici diversa da una stringa rispetto ad un'altra, il comportamento della funzione, per effettuare il riordino, cambia ! Infatti, se per esempio facciamo compiere il riordino ([u]ascendente[/u], come prima) di queste tre stringhe: "[i]55z[/i]", "[i]111p[/i]" e "[i]9a[/i]", il riordino prenderà in considerazione il [u]primo[/u] carattere sulla base del protocollo ASCII. In tal caso avremo questo riordino: [color=maroon]111p 55z 9a[/color] e [u]non[/u] il contrario, come ci aspetteremmo !

Per ovviare a questo inconveniente, uno stratagemma può essere quello di far aggiungere degli zero dinanzi al primo carattere, in maniera tale che ciascuna stringa iniziale, alla quale saranno stati aggiunti quegli zero, abbia [u]così[/u] lo [u]stesso numero di caratteri[/u] delle altre stringhe presenti nell'array. Prendendo le stringhe di prima, insomma dovremo per esempio avere: 0111p 0055z 0009a

[code=gambas] Public Sub Button1_Click()

Dim j As Byte
Dim s as string
 For j = 0 To 2
   s = String$(5 - Len(GridView1[j, 0].Text), "0") & GridView1[j, 0].Text

' Carichiamo quelle stringhe così modificate nella variabile array:

   a.Add(s)
 Next

[/code]

e procedendo quindi al riordino mediante il predetto metodo [i]variabile_Array.[color=maroon]Sort[/color][/i], riusciremo ad ottenere il riordino di quelle particolari stringhe; ed avremo la nuova disposizione degli elementi all'interno dell'array come segue: 0009a 0055z 0111p

Successivamente elimineremo gli zero che abbiamo [i]strategicamente[/i] aggiunto: [code=gambas] For j = 0 To 2

 a[j] = Replace(a[j], "0", "")

Next [/code]

e ripiazziamo, così, nella 1[sup]a[/sup] colonna quelle tre stringhe, ri-ordinate e ripulite dagli zero che avevamo aggiunto: [code=gambas]

  For j = 0 To 2
     GridView1[j, 0].Text = a[j]
   Next
End

[/code]

ed il gioco è fatto: 9a 55z 111p