Italian Eliminare elementi da un array

Discussion in 'Italian Forum' started by gepo, Jan 11, 2019.

  1. gepo

    gepo Member Licensed User

    Salve a tutti, ho un problema che spero qualche esperto possa risolvere.
    Ho un array con delle parole separate da uno spazio. Fino a quando aggiungo elementi tutto va bene; il problema è che, quando elimino una parola, gli spazi invece rimangono e si sballa tutto. Ad esempio...ho l'array "cane gatto topo". Se elimino topo, che sta alla fine tutto ok; se invece elimino gatto mi rimane "cane topo" con uno spazio in più in mezzo che non va bene. Ho provato a risolvere eliminando anche lo spazio successivo alla parola ma come si fa a dire al programma eliminami lo spazio solo se la parola non è alla fine dell'array? Spero di essermi spiegato...grazie!
     
  2. udg

    udg Expert Licensed User

    Più che un array, la tua sembra una stringa.
    Puoi sempre sostituire la sottostring " " (doppio spazio con la sottostring " " (spazio singolo)
     
    sirjo66 likes this.
  3. Star-Dust

    Star-Dust Expert Licensed User

    Prova con S.Replace(" "," ")

    Ma è un Array o una stringa che contiene più parole?
     
    Last edited: Jan 11, 2019
  4. gepo

    gepo Member Licensed User

    È un'array che viene riempito via via di variabili per cui non posso sapere a priori se ne conterrà una, due o cento. Ho provato con replace "" e questo toglie la variabile prescelta dall'utente ma fa rimanere lo spazio successivo a questa per cui questo spazio si va sommare a quello della variabile precedente. Ho provato a sostituire sia la variabile che lo spazio successivo e tutto fila liscio. Il problema nasce dal fatto che l'ultima variabile dell'array, essendo ultima, non ha lo spazio successivo per cui non so come dire a b4a di eliminare lo spazio successivo solo se la variabile non è alla fine dell'array...
     
  5. Star-Dust

    Star-Dust Expert Licensed User

    Purtroppo non ho capito bene. Fai un piccolo esempio di codice
     
  6. Filippo

    Filippo Expert Licensed User

    Penso che così dovrebbe funzionare:
    Code:
    Dim str As String = "cane gatto topo"
        
        
    If str.IndexOf("gatto ") > -1 Then
        
            str.Replace(
    "gatto """)
            
        
    Else If str.IndexOf("gatto") > -1 Then
            str.Replace(
    "gatto""")
                    
        
    End If
     
    Star-Dust likes this.
  7. LucaMs

    LucaMs Expert Licensed User

    Io sono sulla stessa lunghezza d'onda di @udg, ovvero... mica ho capito.

    Hai un array in cui ogni elemeno potrebbe essere composto da testi come quello, con 3 nomi separati da spazi?

    Comunque sia, potresti usare delle List, in modo da eliminare qualunque elemento tu voglia e, se necessario, ricostruire la stringa prelevando gli elementi dallla List.
     
  8. gepo

    gepo Member Licensed User

    ' PizV14 è la variabile caricata da un fle di testo che contiene una o più parole separate da uno spazio

    Dim components() As String ' creo l'array
    components = Regex.Split(" ", Pizv14) ' qui carico l'array dividendo la stringa in corrispondenza dello spazio
    ListaVarSpin.AddAll(components) ' qui carico l'array in uno spinner

    ' in questa sub l'utente seleziona l'elemento dalla lista e lo elimina tenendo premuto a lungo
    Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
    Dim DaSostituire As String
    DaSostituire=AltreTxt.Text ' qui prelevo da una text box riempita dall'utente l'elemento da eliminare
    PizV14=PizV14.replace(DaSostituire&" ","") ' sostituisco l'elemento ed in più lo spazio successivo
    End Sub

    Se DaSostituire è l'ultimo elemento dell'array non devo togliere lo spazio (perchè non esiste) per cui:
    PizV14=PizV14.replace(DaSostituire,"")

    Come faccio a capire che si tratta dell'ultimo elemento in modo che b4a operi il primo o il secondo tipo di sostituzione?
     
  9. Star-Dust

    Star-Dust Expert Licensed User

    Primo metodo
    Code:
    Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
        PizV14=PizV14.replace(AltreTxt.Text,
    "").replace("  "," ").Trim
    End Sub
    secondo:
    Code:
    Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
        
    If PizV14.EndsWith(AltreTxt.Text) Then
            PizV14=PizV14.replace(
    " " & AltreTxt.Text,"")
        
    Else
            PizV14=PizV14.replace(AltreTxt.Text & 
    " ","")
        
    End If
    End Sub
    oppure: (secondo alternativo)
    Code:
    Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
        
    If PizV14.StartsWith(AltreTxt.Text) Then
            PizV14=PizV14.replace(AltreTxt.Text & 
    " ","")
        
    Else
            PizV14=PizV14.replace(
    " " & AltreTxt.Text,"")
        
    End If
    End Sub
    terzo
    Code:
    Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
        PizV14=
    ""
        
    For Each SingolaVoce As String In ListaVarSpin
            
    If SingolaVoce<>AltreTxt.Text Then PizV14=PizV14 & SingolaVoce & " "
        
    Next
        PizV14=PizV14.Trim 
    ' oppure PizV14=PizV14.Substring2(0,PizV14.Length-1)
    End Sub
    Quarto:
    Code:
    Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
        PizV14=
    ""
        AggiunteList.RemoveAt(Position)
        
    For I=0 To AggiunteList.Size
            PizV14=PizV14 & 
    " " & AggiunteList.GetItem(I)
        
    Next
        PizV14=PizV14.Trim 
    ' oppure PizV14=PizV14.Substring(1)
    End Sub
    il quinto modo te lo ha già suggerito @Filippo:
    Code:
    Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
      
    If PizV14.IndexOf(AltreTxt.Text & " ") >= 0 Then
         PizV14.Replace(AltreTxt.Text & 
    " """)
      
    Else If PizV14.IndexOf(AltreTxt.Text) >= 0 Then
         PizV14.Replace(AltreTxt.Text, 
    "").Trim
      
    End If
    '  -- Alternativa --
    '  If PizV14.IndexOf(" " & AltreTxt.Text) >= 0 Then
    '     PizV14.Replace(" " & AltreTxt.Text, "")
    '  Else If PizV14.IndexOf(AltreTxt.Text) >= 0 Then
    '     PizV14.Replace(AltreTxt.Text, "").Trim
    '  End If
    End Sub
    Come avrai notato, quando si toglie l'ultimo elemento (ma va bene anche per gli elementi intermedi), tolgo anche lo spazio che precede, così il penultimo (ora diventato ultimo) non ha spazi che lo seguono. Non va applicato solo se togli il primo elemento che non ha spazi che lo precedono.
    Viceversa se togli il primo elemento va tolto anche lo spazio successivo (e va bene anche per gli elementi intermedi), ma ovviamente non per l'ultimo elemento.
    Cmq il primo metodo è il più semplice

    PS: non capisco a che serva AltreTxt.Text se la stringa selezionata viene restituita in Value e in AggiunteList.GetItem(position). Non puoi usare Value?
     
    Last edited: Jan 11, 2019
    Filippo likes this.
  10. LucaMs

    LucaMs Expert Licensed User

    E se togliessi gli spazi subito?

    Code:
    ' dopo il regex
    For i = 0 To components.Length - 1
       components(i) = components(i).Trim
    Next
     
  11. LucaMs

    LucaMs Expert Licensed User

    Nota che quando pubblichi codice qui, la cosa migliore è usare:


    upload_2019-1-11_17-10-50.png
     
    Filippo likes this.
  12. gepo

    gepo Member Licensed User

    Perfetto ragazzi! Ho provato il primo metodo suggerito da Star Dust e funziona alla grande!! (ma studierò anche gli altri...) Vi confesso che, prima di rivolgermi al forum, avevo trovato anch'io una soluzione ma era un caos pazzesco con decine di linee di codice, variabili ecc. ecc. in pratica come andare a Roma passando prima dal Polo Nord. Non potevo proprio andare avanti... Invece con una linea sola di codice il problema è risolto. Pazzesco! Ma è comprensibile...tanto per usare un'altra metafora... per me programmare in b4a è come parlare italiano conoscendo solo 10 parole. Grazie a tutti per il supporto e rassicuro LucaMs che la prossima volta pubblicherò il codice nel posto giusto!

    PS per Star Dust: Altretxt.text serve perchè nella lista da LongCliccare ci sono alcuni valori fissi che possono essere eliminati direttamente ma anche un valore generico (Altre aggiunte) che viene poi specificato caricando i sottovalori dallo spinner ListaVarSpin (che si alimenta man mano che vengono inserite le aggiunte) e immessi nella text box
     
  13. Star-Dust

    Star-Dust Expert Licensed User

    Ottimo.

    Allora non usare il 4 metodo che prevede che nella listView ci siano i valori da cancellare.
     
  14. LucaMs

    LucaMs Expert Licensed User

    Fortunatamente non mi compaiono le risposte di Star-dust (messo in ignore)
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice