Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    Come si ordina un vettore secondo l'ordine ASCII???

    Ho un vettore di stringhe da ordinare:
    codice:
    Dim a$() = {"'Z", "AA", ***
    Vorrei ordinare il vettore secondo l'ordina ASCII, ossia, 'Z deve andare prima di AA, mentre il metodo sort, di default, fa esattamente l'opposto. Inoltre, l'ordinamento deve essere insensibile alle maiuscole e minuscole
    Vi prego di aiutarmi, perchè sono arrivato al limite

    Ciao
    Pietro

  2. #2
    Dovrebbe essere:
    codice:
    Array.Reverse(a$)
    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da AndreaZani
    Dovrebbe essere:
    codice:
    Array.Reverse(a$)
    Ciao
    Gentilissimo Andrea, Forse non mi sono spiegato bene e forse è perchè oggi è una tristissima scurissima giornata di Dicembre

    Allora, se abbiamo un vettore di stringhe e lo vogliamo ordinare, non in ordine alfabetico ma in ordine ASCII, non mi dirai che tu usi il metodo Reverse :master: Dai, non ci credo!
    Non posso credere che il Framework non abbia una classe per fare ciò

    Io pensavo ad una classe ausiliaria che implementi IComparer o qualcosa di simile, ma non sono abbastanza bravo per fare da solo

    Ciao
    Pietro

  4. #4
    Fermo fermo, l'ordinamento ASCII è alfabetico!

    Prova a scrivere:
    codice:
    for t as integer=65 to 122
    Response.Write(String.Format("{0} - {1}
    ",t,chr(t)))
    next
    E vedrai che l'ordiamento dei codici ASCII.

    Una volta che hai un array è sufficiente eseguire prima il SORT:
    codice:
    Array.Sort(tuo_array)
    Quindi, per invertire l'ordine:
    codice:
    Array.Reverse(tuo_array)
    Non capisco dov'è il problema che tu dici di avere!

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2002
    Messaggi
    4,127
    credo ke il problema non sia nell'ordine alfabetico, ma quando si incontrano altri caratteri..
    ora mi pare di aver letto un altro post di pietro dove si diceva ke x js l'apostrofo andava prima di A, x il .net l'apice andava in fondo all'alfabeto..
    cmq uno dei due non sta usando l'ordine ascii

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Un grazie sentito a sms per il suo appoggio morale
    Vediamo di essere un poco più chiari
    Il carattere ' (apostrofo) ha codice ascii 39, mentre il carattere A, ha codice ascii 65. Ordinando secondo i codici ascii, ne consegue che il carattere ' viene prima di A. Detto questo, sperando che si sia capito , andiamo in javascript e scriviamo:
    codice:
    alert("SANT'ANTIOCO < SANTA GIUSTA = " + ("SANT'ANTIOCO" < "SANTA GIUSTA") );
    Questo scritto mi dà true, perchè SANT' è minore di SANTA.
    Andiamo in Basic. Se scrivo:
    codice:
    PrintLn("SANT'ANTIOCO < SANTA GIUSTA = " + CStr("SANT'ANTIOCO" < "SANTA GIUSTA"))
    Che mi restituisce ancora true, come in javascript (e prevenendo qualcuno che sicuramente avrà da ridire su cosa sia mai Println risponderò che è una funzioncina che dà Response.Write(... & "
    "...)

    Riandiamo in javascript.
    se scrivo:
    codice:
    var v= ["SANT'ANTIOCO", "SANTA GIUSTA"];
    v.sort();
    lista_array(v);
    lista_array(v) mi apre un popup che visualizza il vettore ordinato v e trovo, naturalmente che,
    v[0] = "SANT'ANTIOCO"
    v[1] = "SANTA GIUSTA"

    Adesso, andiamo in asp.net
    codice:
            Dim v$() = {"SANT'ANTIOCO", "SANTA GIUSTA"}
            v.Sort(v)
            For Each element As String In v
                PrintLn(element)
            Next
    Ebbene, il vettore ordinato mette
    v(0) = "SANTA GIUSTA"
    v(1) = "SANT'ANTIOCO"

    Insomma, per Andrea è tutto normale, ma per me non lo è poi così tanto.

    Ma non è finita In javascipt scrivo una routine banaluccia che non fa altro che trovare un elemento in un vettore. Data che la lista supera gli 8000 elementi, ho pensato di usare l'algoritmo FIND, che come tutti sanno funziona utilizzando la bisezione in una lista ORDINATA. Ripeto, funziona su una lista ordinata.
    Adesso :master: la mia routine Find, non funziona perchè ho scoperto che il problema è nel fatto che il vettore non è precisamente ordinato.

    Non è finita (non vi addormentate), tutto questo codice con i suoi problemi, è inglobato in un controllo utente, che, lato server, riempie un listbox ordinato e crea un vettore javascript.
    E' vero, potrei, una volta che la pagina arriva al client, usare javascript per ordinarmi la <select creata e per riordinarmi il vettore creato nel server, ma, sapendo che ASP.NET fa tutto e di più, non voglio assolutamente farlo
    Quello che mi è necessario è ordinare un vettore secondo l'ordine Ascii. La cosa non è nè difficile, nè tantomeno impossibile.
    Si tratta di utilizzare una versione di overloads del metodo Sort della classe Array, che accetta come secondo parametro un oggetto che implementa IComparer (la tecnica è di per se oltremodo potente)

    :master: Abuso della vostra pazienza ma... non è finita.

    Leggo i dati da una tabella Access
    codice:
    SELECT ID, NOME_COMUNE FROM COMUNI WHERE NOME_COMUNE LIKE 'SANT%' AND CODICE_ISTAT_REGIONE = '20' ORDER BY NOME_COMUNE
    Naturalmente, il recordset ordinato, mette "SANTA GIUSTA" prima di "SANT'ANTIOCO" e a me serve invece il contrario

    Boh! proviamo a crearci un DataView da un DataTable e proviamo ad ordinarlo. Ma il metodo sort non accetta una interfaccia del tipo IComparer... Come faccio ad ordinare il recordset per nome_comune ma ordinandola per codici ascii e non secondo Access?
    Io non so :master: e spero nel vostro aiuto.

    ps. la lista non deve essere ordinata con ordinamento invertito, ma:
    ***
    AOSTA
    ***
    SANT'ANTIOCO
    ***
    SANTADI
    ****
    Pietro

  7. #7
    Perché, dato un array, non ti crei un algoritmo di orginamento? Prestazionalmente in asp.net non dà problemi. Prova a leggere questo tutorial. Sono presenti gli algoritmi scritti in vb per il classic ASP, ma una conversione in asp.net è banale.

    Ciao
    AZ [Microsoft - .NET MVP]
    Mia Home page: http://ciclismo.sitiasp.it
    Asp.Net community: http://www.aspitalia.com
    Il mio blog: http://blogs.aspitalia.com/az

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da AndreaZani
    Perché, dato un array, non ti crei un algoritmo di orginamento? Prestazionalmente in asp.net non dà problemi. Prova a leggere questo tutorial. Sono presenti gli algoritmi scritti in vb per il classic ASP, ma una conversione in asp.net è banale.

    Ciao
    In effetti mi sono messo in libreria il vecchio QuickSort già dai tempi di Asp, e l'ho pure messo in una libreria javascript. Poi ho scoperto che un vettore javascript si può ordinare in maniera nativa con un meccanismo molto semplice e potente.
    Poi è arrivato Asp.Net, che tra le migliaia di classi ha pure il metodo Sort che funziona benissimo ed è anche molto potente. In pratica, dato un vettore, lo ordino, nel mo particolare caso, così:
    codice:
            Dim a$() = {"'Z", "AA", "b", "a", "SANTA GIUSTA", "SANTA MARIA COGHINAS", "SANTA TERESA GALLURA", "SANTADI", "SANT'ANDREA FRIUS", "SANT'ANNA ARRESI", "SANT'ANTIOCO", "SANT'ANTONIO DI GALLURA", "SANTU LUSSURGIU"}
            Array.Sort(a, New asciiOrderClass)
            For Each el As String In a
                PrintLn(el)
            Next
    dove l'oggetto asciiOrderClass è una istanza della classe:
    codice:
    Public Class asciiOrderClass
        Implements IComparer
    
        Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
            Implements IComparer.Compare
            'due oggetti null sono uguali
            If (x Is Nothing) And (y Is Nothing) Then Return 0
    
            'ogni oggetto non null è maggiore di un oggetto null
            If x Is Nothing Then Return 1
            If y Is Nothing Then Return -1
    
            Dim p1$ = DirectCast(x, String).ToUpper
            Dim p2$ = DirectCast(y, String).ToUpper
    
            Return String.CompareOrdinal(p1, p2)
    
        End Function
    
    End Class
    Se prendo i dati da una tabella, non ho trovato di meglio che fare così:
    codice:
            Dim sql$ = "SELECT ID, NOME_COMUNE FROM COMUNI WHERE NOME_COMUNE LIKE 'SANT%' AND CODICE_ISTAT_REGIONE = '20' "
            Dim dt As DataTable = Libreria.GetDataTable(StringaConnessione, sql)
    
            dt.Columns.Add("nomeESADECIMALE", GetType(String))
            For Each dr As DataRow In dt.Rows
                dr("nomeESADECIMALE") = Libreria.StringaToEsadecimale(Libreria.NullToString(dr("nome_comune")).ToUpper)
            Next
            Dim dv As New DataView(dt)
    
    
            dv.Sort = "nomeESADECIMALE"
    
    
    
            Me.DataGrid1.DataSource = dv
            Me.DataGrid1.DataKeyField = "id"
            Me.DataGrid1.DataBind()
    Ciao
    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.