IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Opération entre tableaux [Débutant]


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut Opération entre tableaux
    Bonjour à tous,
    Je suis confronté au problème suivant :
    J'ai un Tableau_1 à une colonne d'environ 150000 lignes, ou chaque lignes contient un mot.
    J'ai un autre Tableau_2 à une colonne également, contenant environ 150 lignes, ou chaque lignes contient un mot. Ces mots sont très courant et chacun est présent plusieurs fois dans le Tableau_1.

    Je souhaiterai soustraire tous les mots contenus dans le Tableau_2 au Tableau_1 de manière à avoir un nouveau Tableau_3.

    J'espère être clair dans mon explication.

    Auriez vous une idée quand à la manière de procéder?
    Existe-t-il un outil ou une fonction prévu pour ce genre ce chose ou dois-je passer par une boucle?

    Merci d'avance!

  2. #2
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Si j'ai bien compris T3 = T1 - T2

    Si tu as au minimum le framework 4 tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
           Dim T1 As New List(Of String) From {"x", "y", "z"}
            Dim T2 As New List(Of String) From {"y"}
            Dim T3 As New List(Of String)
     
            T3 = T1.Except(T2).ToList
     
            For Each item As String In T3
                Console.WriteLine(item) 'retourne x et z
            Next

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut
    Merci pour ta réponse,
    Oui c'est ça je veux faire T3= T1-T2

    Et je cherchais bien un outil du genre Except

    Par contre j'utilise des List (of Class) ou ma class est un objet défini comme un string

    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Class Stopwords
        Public stopword As String
    End Class
    Et donc mes 2 list(of stopwords) sont celles qui seront utilisées pour créer T3.

    Je ne sais pas si Except est compatible avec ces types de list (j'ai le message d'erreur suivant que je lance le programme : "Le membre public 'Except' du type 'List(Of Stopwords)' est introuvable"

    Une idée de comment y remedier?
    Merci d'avance

  4. #4
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    A quoi sert ta classe concrètement ? Où est l'utilité d'avoir une liste d'objets d'une classe qui ne contient qu'une string, plutôt qu'une liste de string ?

    Tu peux aussi songer à créer ta propre classe de list qui implémenterait IEnumerable et ICollection ...

    Je ne sais pas comment tu as fait ton code, mais la liste of class restant IEnumerable, ça marche chez moi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
           Dim T1 As New List(Of stopwords)
            Dim T2 As New List(Of stopwords)
            Dim T3 As New List(Of stopwords)
     
            Dim tata As New stopwords
            Dim toto As New stopwords
            Dim titi As New stopwords
            Dim tutu As New stopwords
     
            tata.stopword = "X"
            toto.stopword = "Y"
            titi.stopword = "V"
            tutu.stopword = "V"
     
            T1.Add(tata)
            T1.Add(toto)
            T1.Add(titi)
            T2.Add(tata)
     
            T3 = T1.Except(T2).ToList
     
            For Each item As stopwords In T3
                MsgBox(item.stopword.ToString) 'retourne X et Y
            Next
    En revanche, et sans que je sache pourquoi, ce code-ci me renvoit X,Y et Z.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            Dim T1 As New List(Of stopwords)
            Dim T2 As New List(Of stopwords)
            Dim T3 As New List(Of stopwords)
     
            T1.AddRange({New stopwords With {.stopword = "X"}, New stopwords With {.stopword = "Y"}, New stopwords With {.stopword = "Z"}})
            T2.Add(New stopwords With {.stopword = "Z"})
     
            T3 = T1.Except(T2).ToList
     
            For Each item As stopwords In T3
                MsgBox(item.stopword.ToString) 'retourne X Y et Z
            Next
    Mais dans tous les cas, je n'ai pas de message d'erreur ...

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut
    Merci pour cette belle réponse

    C'est très bizarre, j'ai bel et bien mes 2 lists, qui sont non nulles (je vérifie avec une msgbox(T1.count) et msgbox(T2.count)

    Mais en appliquant la formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T3 = T1.Except(T2).ToList
     
            For Each item As stopwords In T3
                MsgBox(item.stopword.ToString) 
            Next
    Rien ne se passe, je n'ai pas de msgbox a chaque tour de boucle, et quand je teste le contenu de la liste T3 avec une msgbox(T3.count) toute à la fin de la procédure il me renvoit 0...
    Grrrr

  6. #6
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Peut-on voir le code complet ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut
    Je suis débutant hein on ne rigole pas!
    voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    Public Class Form1
    Public Tabmots As New List(Of Stopwords)
     
    Dim T As Integer = Tabmotsnontries.Count
     
            Dim Tabmots As New List(Of Stopwords)
            For i = 0 To T - 1
                Tabmots.Add(New Stopwords)
     
                Tabmots(Tabmots.Count - 1).stopword = Tabmotstries(i)
            Next
            MsgBox(Tabmots.Count)
     
     
        End Sub
     
     
    End class
     
    Public Class form2
     
        Dim listestopwords As New List(Of Stopwords)
        Dim tabmots2 = Form1.tabmots
     
     
    Sub createstopwordslist(ByRef ListeStopwords As List(Of Stopwords))
     
            Dim mot As String
            Dim sr As New StreamReader("stopwords.txt")
            Do While sr.Peek() > -1
                mot = sr.ReadLine
     
                ListeStopwords.Add(New Stopwords)
                ListeStopwords(ListeStopwords.Count - 1).stopword = mot
     
            Loop
            MsgBox(ListeStopwords.Count)
        End Sub
     
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            stopwordslist.Items.AddRange(System.IO.File.ReadAllLines("stopwords.txt"))
            createstopwordslist(listestopwords)
        End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim Listcleared As New List(Of Stopwords)
     
     
     
            Listcleared = tabmots2.Except(listestopwords).ToList
     
            For Each item As Stopwords In Listcleared
                MsgBox(item.stopword.ToString)
            Next
     
     
        End Sub
    End Class

  8. #8
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    On a tous été débutants.

    Dans ton Form1 tu déclares une variable haute "Public Tabmots", puis dans la procédure en dessous, tu redéclares Tabmots pour la remplir, donc lorsque tu fais Form1.Tabmots, tu pointes la variable haute, tu récupères une liste qui n'a jamais été remplie, et donc dans ton Except, tu n'as rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Public Class Form1
    
        Public Tabmots As New List(Of stopwords)
    
        Public Sub tata()
            Dim T As Integer = Tabmotsnontries.Count
    
            Dim Tabmots As New List(Of stopwords)
            For i = 0 To T - 1
                Tabmots.Add(New stopwords)
                Tabmots(Tabmots.Count - 1).stopword = Tabmotstries(i)
            Next
            MsgBox(Tabmots.Count)
        End Sub
    End Class

    Tu peux vérifier que j'ai bon en testant la taille de Tabmots avant .Except()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim Listcleared As New List(Of Stopwords)
     
            MsgBox(tabmots2.Count)
     
            Listcleared = tabmots2.Except(listestopwords).ToList
     
            For Each item As Stopwords In Listcleared
                MsgBox(item.stopword.ToString)
            Next
     
     
        End Sub

  9. #9
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut
    En effet elle était bel et bien vide, en faite je testais son contenu trop tôt, car comme tu dis la liste prise pour la procédure avec le except génére une liste vide.

    Maintenant j'ai testé les contenus des listes, les deux sont pleines

    Mais lors de l'éxecution j'ai toujours l'erreur dont je t'ai parlé :L'exception MissingMemberException n'a pas été gérée : Le membre public 'Except' du type 'List(Of Stopwords)' est introuvable.

    Pourtant je suis sur le framework 4.5, et avant l'exécution je n'ai aucun mise en garde contre ce problème.

  10. #10
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Essaye de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim tabmots2 = Form1.tabmots
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim tabmots2 as List(of stopwords) = Form1.tabmots

    A part ça je vois pas ...

  11. #11
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut
    L'erreur à disparu félicitation
    Par contre, je ne suis pas sur à 100% de comprendre ce que fait cette ligne
    Listcleared = tabmots2.Except(listestopwords).ToList

    imaginons que j'ai notre T1 contenant les mots (as, as, also, and, above, again, and, as)

    et que mon T2 contienne : (and, as, a, also)

    en faisant T1-T2 je vais supprimer que un seul des "as" contenu dans le T1, ou tout les "as"?

  12. #12
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Je souhaiterai soustraire tous les mots contenus dans le Tableau_2 au Tableau_1 de manière à avoir un nouveau Tableau_3.
    Oui oui ...mais le resultat se comporte comme s'il y avait le fameux predicat "Distinct" imprevu.....!!!
    Observe egalement ces 2 requetes Linq,ce qui donne des resultats differents:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Public Class Form1
     
    'Linq  avec le predicate Except......
    'j'ai double sciemment le string "above"  
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim words1 As List(Of String) = New List(Of String) From {"as", "as", "also", "and", "above", "again", "for each", "for each", "and", "as"}
            Dim words2 As List(Of String) = New List(Of String) From {"and", "as", "a", "also"}
     
     
            Dim T3 As List(Of String) = New List(Of String)
            T3 = words1.Except(words2, StringComparer.OrdinalIgnoreCase).ToList
            ListBox1.DataSource = T3
        End Sub
     
      'Linq  avec le predicate RemoveAll combine à ForEach raccourci..
        'Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
     
        '    Dim words1 As List(Of String) = New List(Of String) From {"as", "as", "also", "and", "above", "again", "for each", "for each", "and", "as"}
        '    Dim words2 As List(Of String) = New List(Of String) From {"and", "as", "a", "also"}
     
        '    Dim T3 As List(Of String) = New List(Of String)
        '    'Comparing the two lists and gettings common elements.
        '    T3 = words1.Intersect(words2, StringComparer.OrdinalIgnoreCase).ToList
        '    ListBox2.DataSource = T3
        'End Sub
     
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Dim words1 As List(Of String) = New List(Of String) From {"as", "as", "also", "and", "above", "again", "for each", "for each", "and", "as"}
            Dim words2 As List(Of String) = New List(Of String) From {"and", "as", "a", "also"}
     
            words2.ForEach(Function(p) words1.RemoveAll(Function(x) x = p))
            ListBox2.DataSource = words1
        End Sub
    End Class
    bon code...

  13. #13
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut
    Merci pour cette belle réponse, je n'ai plus visual studio sous la main ce week end mais je testerai ces fonctions dès que possible. J'ai hâte de voir le résultat de la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T3 = words1.Intersect(words2, StringComparer.OrdinalIgnoreCase).ToList
    Je devrais bien trouver mon bonheur parmis tout ça
    Merci encore, je vous tiens au courant!

  14. #14
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 101
    Par défaut
    J'ai testé chacune des propositions, j'ai constaté que celle qui fait exactement ce que je souhaite est celle-ci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    words2.ForEach(Function(p) words1.RemoveAll(Function(x) x = p))
            ListBox2.DataSource = words1

    Celle ci supprime bien les termes de la liste words2 dans words1 mais supprime également les doublons présent au sein de la liste words1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim T3 As List(Of String) = New List(Of String)
            T3 = words1.Except(words2, StringComparer.OrdinalIgnoreCase).ToList
            ListBox1.DataSource = T3
        End Sub
    Tandis que celle ci, comme son nom l'indique, me donne les mots communs au deux listes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T3 = words1.Intersect(words2, StringComparer.OrdinalIgnoreCase).ToList
         ListBox2.DataSource = T3
    Merci à vous pour cette considération!
    Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Opération entre vecteurs
    Par Muriellle dans le forum Signal
    Réponses: 7
    Dernier message: 09/07/2008, 23h39
  2. Espace entre tableaux quand transfert emailing sur outlook 2007
    Par speedev dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 31/05/2008, 10h36
  3. Réponses: 1
    Dernier message: 07/01/2008, 00h16
  4. Opérations entre variables
    Par coincoin22 dans le forum Linux
    Réponses: 13
    Dernier message: 17/08/2007, 13h00
  5. [XHTML/CSS] Problème d'espaces entre tableaux
    Par falcon dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 16/06/2006, 10h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo