Comparaison entre deux tableau

Signaler
Messages postés
35
Date d'inscription
mercredi 30 juillet 2014
Statut
Membre
Dernière intervention
27 avril 2017
-
Messages postés
16132
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
31 juillet 2021
-
Bonjour à tous,

J'ai encore un petit souci avec mon programme. J'ai une base qui fonctionne mais je souhaiterai l'optimiser. Dans le programme qui fonctionne, je demande à l'utilisateur de me dire le nombre d'API différents qu'il y a dans son projet et ensuite, le nom de chacun. L'idée serait d'automatiser ces fonctions en calculant le nombre d'automate puis en demandant à l'opérateur si le nom que j'ai dans mon fichier est correcte.
Voici mon code:
 Dim NbrAPI As Integer = 1 'Nombre d'API contenu dans le projet (initialisé à 1)
        Dim ColAPI(10, 2) As String 'Tableau qui accueillera le nom des différents automates du projet
        Dim Nblignes As Integer = 5
        Dim tab(Nblignes, 2) As String
        tab(0, 0) = "tata"
        tab(1, 0) = "tete"
        tab(2, 0) = "titi"
        tab(3, 0) = "toto"
        tab(4, 0) = "tutu"

        'Calcul du nombre d'automate déclaré dans le projet
        ColAPI(0, 0) = tab(0, 0) 'On recopie le nom de l'API déclaré à la première ligne
        For X = 0 To UBound(tab) - 1
            Dim index_boucle_nom_api As Integer
            For index_boucle_nom_api = 0 To 9
                If tab(X, 0) <> ColAPI(index_boucle_nom_api, 0) Then
                    ColAPI((index_boucle_nom_api + 1), 0) = tab(X, 0)
                    NbrAPI = NbrAPI + 1
                End If
            Next
        Next
        MessageBox.Show(NbrAPI)

Normalement, il devrait m'afficher 5 mais ça ne fonctionne pas, il m'affiche 26...
Avez vous une idée de l'origine de mon problème?

Merci d'avance de votre aide

5 réponses

Messages postés
16132
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
31 juillet 2021
556
Bonsoir si j'ai bien compris ton besoin, alors l'utilisation de tableaux n'est pas adaptée.

Il serait plus simple de te servir de liste d'objet avec des requêtes Linq
Messages postés
16132
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
31 juillet 2021
556
D'ailleurs pour tes fichiers csv aussi
Messages postés
16132
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
31 juillet 2021
556
Pour exemple voici une classe (vu que tu as deux colonnes dans tes tableaux j'ai supposé que tu as 2 paramètres à sauvegarder le nom et un autre que j'ai appelé AutreInfo)
Public Class AutomateQuentin22Breizh
    Public Sub New(ByVal Nom As String, ByVal AutreInfo As String)'constructeur de la classe qui assigne les propriétés
        Me.Nom = Nom
        Me.AutreInfo = AutreInfo
    End Sub

    Public Property Nom() As String

    Public Property AutreInfo() As String

    Public Overrides Function ToString() As String 'j'impose ce que je veux voir pour le ToString, utile en exécution pas à pas, c'est ce texte que l'on verra en survolant l'objet avec la souris
        Return String.Format("Nom : '{0}', complément : {1}", Nom, AutreInfo)
    End Function
End Class



et puis un petit code test, que je te conseille de suivre en pas à pas:
Dim APIutilises As New List(Of AutomateQuentin22Breizh)

        'le premier avantage par rapport à un tableau est que tu ajoutes des items comme tu veux sans avoir à prédire la taille
        APIutilises.Add(New AutomateQuentin22Breizh("toto", "rien"))
        APIutilises.Add(New AutomateQuentin22Breizh("tata", "rien"))
        APIutilises.Add(New AutomateQuentin22Breizh("tutu", "rien"))
        APIutilises.Add(New AutomateQuentin22Breizh("titi", "rien"))
        APIutilises.Add(New AutomateQuentin22Breizh("toto", "hoho doublon"))
        APIutilises.Add(New AutomateQuentin22Breizh("erreur", "a supprimer"))
        APIutilises.Add(New AutomateQuentin22Breizh("encore 1 erreur", "a supprimer"))
        APIutilises.Add(New AutomateQuentin22Breizh("tete", "rien"))
        APIutilises.Add(New AutomateQuentin22Breizh("tutu", "encore un doublon"))

        'on obtient facilement le nombre d'enregistrement
        Dim nombreAPI As Integer = APIutilises.Count

        'on peut facilement supprimer un item
        APIutilises.RemoveAt(5)

        Dim nouveauNombreAPI As Integer = APIutilises.Count

        'on peut rechercher un item
        Dim itemAtrouver As AutomateQuentin22Breizh = APIutilises.First(Function(a) a.AutreInfo = "a supprimer")
        'et le supprimer
        APIutilises.Remove(itemAtrouver)

        'on peut connaitre la liste des api différentes utilisée et leur nombre
        Dim NomAPIsansDoublons As List(Of String) = APIutilises.Select(Function(a) a.Nom).Distinct().ToList() 'en fait on peut faire un distinct qui retournerait une liste d'AutomateQuentin22Breizh mais il faudrait lui apprendre comment les comparer, pour un premier exemple c'est un peu long
        Dim nombreAPIsansDoublons As Integer = NomAPIsansDoublons.Count

        'on peut connaitre les éléments communs à deux listes

        Dim autreListe As New List(Of AutomateQuentin22Breizh)
        autreListe.Add(New AutomateQuentin22Breizh("toto", "rien"))
        autreListe.Add(New AutomateQuentin22Breizh("tyta", "rien"))
        autreListe.Add(New AutomateQuentin22Breizh("tutu", "rien"))
        autreListe.Add(New AutomateQuentin22Breizh("titi", "rien"))
        autreListe.Add(New AutomateQuentin22Breizh("toto", "hoho doublon"))
        autreListe.Add(New AutomateQuentin22Breizh("erreur", "a supprimer"))
        autreListe.Add(New AutomateQuentin22Breizh("tete", "rien"))

        Dim communs As List(Of String) = APIutilises.Select(Function(a) a.Nom).Intersect(autreListe.Select(Function(b) b.Nom)).ToList() 'même histoire avec le comparer
Messages postés
35
Date d'inscription
mercredi 30 juillet 2014
Statut
Membre
Dernière intervention
27 avril 2017

Bonjour Whismeril,

Merci de ta réponse. J'avoue que j'ai un peu de mal à comprendre comment adapter ton code à mon besoin mais j'ai surement du mal l'exprimer.
Le souci auquel je suis confronté est le suivant:

Mon fichier est de ce type:

test
test
test
test
test
test
test
test
Variable
Variable

Le calcul devrait me retourner 2. Ensuite, je souhaiterai afficher une fenêtre demandant à l'opérateur ceci:

Le nom du premier API du projet est " test". Confirmez vous ce nom?
Si oui, on ne fait rien, si non, on demande le nouveau nom et on le remplace dans tout le fichier. Ceci pour les N automates qui compose le projet.

J'espere être plus clair maintenant
Messages postés
16132
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
31 juillet 2021
556
Bonjour, non ça n'est pas beaucoup plus clair.

Pourquoi deux? Parce qu'il y a des test et des variables?
Si oui alors c'est exactement le rôle de Distinct.

Et tâche d'éviter l'acronyme API (j'aurais du le dire plus haut d'ailleurs) qui a un sens en programmation différent de tes automates. Ça peut brouiller les pistes.


Messages postés
35
Date d'inscription
mercredi 30 juillet 2014
Statut
Membre
Dernière intervention
27 avril 2017

Bonjour,

Désolé pour la clarité. Je sais où je veux arriver mais je n'arrive pas à le mettre à plat pour l'expliciter simplement.

Oui, c'est ça. Dans mon projet, mon premier automate s'appelle "test" et le second "variable". Je vais essayer de comprendre ton code en le mettant dans mon programme et en le testant en pas à pas
Messages postés
16132
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
31 juillet 2021
556
Ce code est un exemple, il vaut peut être mieux que tu fasses un projet à part pour tester des techniques différentes. Ça évite de polluer son projet principal.