Autore Topic: [Risolto] Operare una sottrazione fra due vettori stringa.  (Letto 1070 volte)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Ho il problema di sottrarre da un vettore stringa tutti i nomi presenti in un altro vettore.
Ho pensato di operare così:
Codice: [Seleziona]
Public Sub Main()

  Dim sAlls As String[] = ["Mickey Mouse", "Donald Duck", "Minnie", "Daisy Duck", "Goofy", "Pluto", "Scrooge McDuck", "Huey", "Dewey", "Louie", "Chip", "Dale"]
  Dim sDonald As String[] = ["Donald Duck", "Daisy Duck", "Scrooge McDuck", "Huey", "Dewey", "Louie"]
  Dim s As String
  Dim i As Integer

  Print "Devo sottrarre questi nomi:"
  For Each s In sDonald
    Print s
  Next
  Print
  Print "A questi altri:"
  For Each s In sAlls
    Print s
  Next
  sAlls.Insert(sDonald)
  sAlls.Sort()
  For i = sAlls.Max To 0 Step -1
    If i > 0 Then
      If sAlls[i] = sAlls[i - 1] Then
        sAlls.Delete(i)
        sAlls.Delete(i - 1)
        Dec i
      Endif
    Endif
  Next
  Print
  Print "Sono rimasti questi:"
  For Each s In sAlls
    Print s
  Next

End
Qualcuno ha un'idea migliore?

 :ciao: :ciao:
« Ultima modifica: 23 Marzo 2018, 23:29:16 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #1 il: 19 Marzo 2018, 23:53:43 »
Ci sto provando ma non mi riesce.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #2 il: 20 Marzo 2018, 01:42:16 »
 ???



« Ultima modifica: 20 Marzo 2018, 03:28:02 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #3 il: 20 Marzo 2018, 03:19:56 »
Si potrebbe proporre una cosa così:   :-\

Codice: [Seleziona]
Public Sub Main()

  Dim sAlls As String[] = ["Mickey Mouse", "Donald Duck", "Minnie", "Daisy Duck", "Goofy", "Pluto", "Scrooge McDuck", "Huey", "Dewey", "Louie", "Chip", "Dale"]
  Dim sDonald As String[] = ["Donald Duck", "Daisy Duck", "Scrooge McDuck", "Huey", "Dewey", "Louie"]
  Dim s1, s2 As String

   s1 = sAlls.Join(Chr(0), Null)
 
   For Each s2 In sDonald
     s1 = Replace(s1, s2 & Chr(0), Null)
   Next

   sAlls = Split(s1, Chr(0))

   Print "Sono rimasti questi:\n"
   For Each s2 In sAlls
      Print s2
   Next

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #4 il: 20 Marzo 2018, 11:49:25 »
Preferisco questa soluzione a quella da me proposta soprattutto perché agire sul contatore di For non mi convince e inoltre sfrutta in modo esemplare l'uso di Join (alter ego di Split).

Attenzione però, il piacere di vuott nell'iserire virtuosismi nel codice :P l'hanno spinto ad un uso non corretto di Replace, per evitare di usare il Null in Split inserisce un insidioso bug che possiamo verificare facendo finire i due vettori con la stessa voce.
Avremmo un confronto fra "voce" e "voce\x00" e così l'ultima non verrebbe eliminata.

Basta cambiare il codice così e credo che non dovrebbero esserci problemi:

Codice: [Seleziona]
Public Sub Main()

  Dim sAlls As String[] = ["Mickey Mouse", "Donald Duck", "Minnie", "Daisy Duck", "Goofy", "Pluto", "Scrooge McDuck", "Huey", "Dewey", "Louie", "Chip", "Dale"]
  Dim sDonald As String[] = ["Donald Duck", "Daisy Duck", "Scrooge McDuck", "Huey", "Dewey", "Louie", "Dale"]
  Dim s1, s2 As String

   s1 = sAlls.Join(Chr(0), Null)
 
   For Each s2 In sDonald
     s1 = Replace(s1, s2, Chr(0))
   Next
   
   sAlls = Split(s1, Chr(0), Null, True)

   Print "Sono rimasti questi:\n"
   For Each s2 In sAlls
      Print s2
   Next

End

 :ciao: :ciao:
« Ultima modifica: 20 Marzo 2018, 11:51:42 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #5 il: 20 Marzo 2018, 12:59:52 »
Al problema rilevato si può ovviare anche modificando questa linea:
Codice: [Seleziona]
s1 = sAlls.Join(Chr(0), Null)

come segue:
s1 = sAlls.Join(Chr(0), Null) & Chr(0)


Ad ogni modo la tua rettifica è perfetta e, a mio avviso, preferibile.


« Ultima modifica: 20 Marzo 2018, 13:03:32 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #6 il: 23 Marzo 2018, 14:52:07 »
 :ciao:
Houston, we've had a problem,

se noi riceviamo i dati da una cartella che contiene file nascosti che hanno lo stesso nome dei file visibili il codice non funziona, vedi codice:

Codice: [Seleziona]
Public Sub Main()

  Dim sAlls As String[] = ["Mickey Mouse", ".Mickey Mouse", "Donald Duck", ".Donald Duck", "Minnie", "Daisy Duck", "Goofy", ".Goofy", "Pluto", "Scrooge McDuck", "Huey", ".Huey", "Dewey", ".Dewey", "Louie", "Chip", "Dale"]
  Dim sDonald As String[] = ["Donald Duck", "Daisy Duck", "Scrooge McDuck", "Huey", "Dewey", "Louie"]
  Dim s1, s2 As String

   s1 = sAlls.Join("|", Null)
 
   For Each s2 In sDonald
     s1 = Replace(s1, s2, "|")
   Next
   
   sAlls = Split(s1, "|", Null, True)

   Print "Sono rimasti questi:\n"
   For Each s2 In sAlls
      Print s2
   Next

End

 :-\  :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #7 il: 23 Marzo 2018, 16:38:17 »
Houston, we've had a problem,


Puoi atterrare, allora, sul "Mare tranquillitatis" della Luna:

Codice: [Seleziona]
Public Sub Main()

  Dim sAlls As String[] = ["Mickey Mouse", ".Mickey Mouse", "Donald Duck", ".Donald Duck", "Minnie", "Daisy Duck", "Goofy", ".Goofy", "Pluto", "Scrooge McDuck", "Huey", ".Huey", "Dewey", ".Dewey", "Louie", "Chip", "Dale"]
  Dim sDonald As String[] = ["Donald Duck", "Daisy Duck", "Scrooge McDuck", "Huey", "Dewey", "Louie", "Dale"]
  Dim s1, s2 As String

   s1 = sAlls.Join(Chr(0), Null)

   For Each s2 In sDonald
     s1 = Replace(s1, s2, Chr(0))
   Next
   
   s1 = Replace(s1, ".\x00", Null)

   sAlls = Split(s1, Chr(0), Null, True)
   
   Print "Sono rimasti questi:\n"
   For Each s2 In sAlls
      Print s2
   Next

End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #8 il: 23 Marzo 2018, 17:01:28 »
Puoi atterrare, allora, sul "Mare tranquillitatis" della Luna:

 ???
Dovrebbero rimanere questi:
Codice: [Seleziona]
.Dewey
.Donald Duck
.Goofy
.Huey
.Mickey Mouse
Chip
Goofy
Mickey Mouse
Minnie
Pluto

e invece rimangono questi:
Codice: [Seleziona]
Mickey Mouse
.Mickey Mouse
Minnie
Goofy
.Goofy
Pluto
Chip

 :-\
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #9 il: 23 Marzo 2018, 17:04:23 »
Ah, quindi quelli preceduti dal puntino non vanno elimnati, nonostante si riferiscano al medesimo personaggio. !?
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #10 il: 23 Marzo 2018, 17:09:26 »
Ah, quindi quelli preceduti dal puntino non vanno elimnati, nonostante si riferiscano al medesimo personaggio. !?

Si e no vanno eliminati solo quelli del secondo vettore, trattandosi appunto di Operare una sottrazione fra due vettori stringa   :-X

Mi spiego meglio: se nel secondo vettore ci fosse ad esempio ".Donald Duck" andrebbe eliminato anche lui malgrado il puntino, ora è più chiaro spero
 :ciao: :ciao:
« Ultima modifica: 23 Marzo 2018, 17:12:58 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #11 il: 23 Marzo 2018, 17:25:57 »
Mi spiego meglio: se nel secondo vettore ci fosse ad esempio ".Donald Duck" andrebbe eliminato anche lui malgrado il puntino, ora è più chiaro spero


Uhmmm.... allora poniamo - a titolo esemplificativo - nel secondo vettore di tipo String i signori Donaldo Ducco e Uèi  :D preceduti entrambi  dal puntino:

Codice: [Seleziona]
Public Sub Main()

  Dim sAlls As String[] = ["Mickey Mouse", ".Mickey Mouse", "Donald Duck", ".Donald Duck", "Minnie", "Daisy Duck", "Goofy", ".Goofy", "Pluto", "Scrooge McDuck", "Huey", ".Huey", "Dewey", ".Dewey", "Louie", "Chip", "Dale"]
  Dim sDonald As String[] = ["Donald Duck", "Daisy Duck", ".Huey", "Scrooge McDuck", ".Donald Duck", "Huey", "Dewey", "Louie", "Dale"]
  Dim s As String
   
   For Each s In sDonald
     sAlls.Remove(sAlls.Find(s, gb.Binary, 0), 1)
   Next


   Print "Sono rimasti questi:\n"
   For Each s In sAlls
      Print s
   Next

End

Ovviamente questo brevissimo e semplicissimo codice può ben sostituire la mia precedente soluzione:
http://www.gambas-it.org/smf/index.php?topic=6191.msg43402#msg43402
« Ultima modifica: 23 Marzo 2018, 17:35:29 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #12 il: 23 Marzo 2018, 17:42:18 »
Moooolto bene, avevo visto questo suggerimento sulla ML fatto da Jussi credo ma non ne avevo ben capito la portata.
Molte grazie per avermelo fatto capire  :ok:  :-*

Oltretutto credo che l'uso di Find non dovrebbe creare la famosa 'quadraticità', o come caspita si dice, tanto paventata in tutti gli interventi sui vettori anche da parte di Minisini.
Credo che 0^2 si crei, ma non ne sono sicuro, quando si confrontano due voci dello stesso vettore tipo voce[n] = voce[n - 1], Find essendo interno a Gambas senz'altro non lo fa.
 :ciao: :ciao:

P.S: Chissà se qualche anima pia  :angel: che ben conosce il C vorrà indagare su come lavora Find?
« Ultima modifica: 23 Marzo 2018, 17:56:09 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #13 il: 23 Marzo 2018, 17:56:05 »
...Find essendo interno a Gambas senz'altro non lo fa.

...perché osservi la "superficie", il grazioso volto di Gambas; bisognerebbe vedere il codice sorgente, scritto in C, del Metodo .Find( ), nativo di Gambas, per verificare come avvengono in quelle "profondità" le comparazioni.
« Ultima modifica: 23 Marzo 2018, 17:58:26 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Operare una sottrazione fra due vettori stringa.
« Risposta #14 il: 23 Marzo 2018, 17:57:21 »
...Find essendo interno a Gambas senz'altro non lo fa.

...perché osservi la "superficie", il grazioso volto di Gambas; bisognerebbe vedere il codice sorgente, scritto in C, del Metodo .Find( ), nativo di Gambas, per verificare come avvengono in quelle "profondità" le comparazioni.

Qualcuno mi legge nel pensiero, aiuto  :evil:
Intendo; guarda l'orario del tuo post e della mia ultima modifica sul post precedente.
 :D
« Ultima modifica: 23 Marzo 2018, 18:02:49 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro