Italian Eliminare elementi da un array

gepo

Member
Licensed User
Longtime 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!
 

udg

Expert
Licensed User
Longtime User
Più che un array, la tua sembra una stringa.
Puoi sempre sostituire la sottostring " " (doppio spazio con la sottostring " " (spazio singolo)
 

Star-Dust

Expert
Licensed User
Longtime User
Prova con S.Replace(" "," ")

Ma è un Array o una stringa che contiene più parole?
 
Last edited:

gepo

Member
Licensed User
Longtime 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...
 

Star-Dust

Expert
Licensed User
Longtime User
Purtroppo non ho capito bene. Fai un piccolo esempio di codice
 
D

Deleted member 103

Guest
Penso che così dovrebbe funzionare:
B4X:
    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
 

LucaMs

Expert
Licensed User
Longtime 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.
 

gepo

Member
Licensed User
Longtime 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?
 

Star-Dust

Expert
Licensed User
Longtime User
Primo metodo
B4X:
Sub AggiunteList_ItemLongClick (Position As Int, Value As Object)
    PizV14=PizV14.replace(AltreTxt.Text,"").replace("  "," ").Trim
End Sub

secondo:
B4X:
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)
B4X:
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
B4X:
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:
B4X:
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:
B4X:
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:

gepo

Member
Licensed User
Longtime 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
 

Star-Dust

Expert
Licensed User
Longtime User
Ottimo.

Allora non usare il 4 metodo che prevede che nella listView ci siano i valori da cancellare.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…