Visualizzazione dei risultati da 1 a 10 su 10

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Non ho testato le prestazioni ma per semplicità potrebbe essere utile scrivere

    codice:
            For i = s.Length - 1 To 1 Step -1
                s = s.Insert(i, ",")
            Next i
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Non ho testato le prestazioni ma per semplicità potrebbe essere utile scrivere

    codice:
            For i = s.Length - 1 To 1 Step -1
                s = s.Insert(i, ",")
            Next i
    Solo per togliermi la ruggine accumulata in questi giorni, dalle prove che sto facendo, questo metodo è il più lento per una stringa di qualche decina di caratteri, mentre è il più veloce per una stringa di pochi caratteri.

    ps. è chiaro che sto calcolando i tempi in un ciclo di un milione di passi e che perciò una soluzione vale l'altra. L'importante secondo me è vedere più soluzioni per imparare a manipolare bene le stringhe.
    Pietro

  3. #3
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Non ho testato le prestazioni ma per semplicità potrebbe essere utile scrivere

    codice:
            For i = s.Length - 1 To 1 Step -1
                s = s.Insert(i, ",")
            Next i
    Questa soluzione ha l'innegabile pregio della semplicità (cosa che in questo caso può convenire privilegiare), ma sapendo cosa accade "sotto il cofano", è abbastanza chiaro che è O(n^2) quando potrebbe essere O(n) (forse anche qualcosa di peggio, dato che le stringhe .NET sono immutabili e ogni modifica equivale ad allocare una nuova stringa).

    In genere per manipolazioni di questo genere l'approccio più rapido è basato su StringBuilder (che corrisponde di fatto ad un buffer di caratteri "stile C"):
    codice:
        Private Function AddCommas(str As String) As String
            If str.Length=0 Then Return str
            Dim sb As New StringBuilder
            sb.Length=str.Length*2
            For i As Integer = 0 To str.Length - 1
                sb(i*2)=str(i)
                sb(i*2+1)=","c
            Next
            sb.Length-=1
            Return sb.ToString()
        End Function
    Credo anch'io che la soluzione in stile programmazione funzionale di sspintux sia la più elegante, ed è sostanzialmente è equivalente a quello che in Python scriverei come
    codice:
    def AddCommas(s):
        return ",".join(s)
    (in effetti, visto che sparisce il 90% della verbosità non starei nemmeno a metterlo in una funzione a parte).

    Da notare che nessuno degli approcci qui citati tiene in considerazione i surrogate pairs; qualunque stringa UTF-16 contenente codepoints superiori a 0xD7FF passata a queste funzioni verrebbe sfasciata senza pietà.

    Per sistemare questo problema, un approccio potrebbe essere:
    codice:
        Private Function AddCommas(str As String) As String
            If str.Length = 0 Then Return str
            Dim sb As New StringBuilder(str.Length*2)
            For i As Integer = 0 To str.Length - 1
                sb.Append(str(i))
                If Not char.IsHighSurrogate(str(i)) Then 
                    sb.Append(","c)
                End If
            Next
            sb.Length-=1
            Return sb.ToString()
        End Function
    Ultima modifica di MItaly; 04-01-2014 a 11:16
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4

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.