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

avec Java Discussion :

Comparer plusieurs tableaux entre eux


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Par défaut Comparer plusieurs tableaux entre eux
    Bonjour à tous ,

    J'ai 8 tableaux composés chacun de 3 lignes et 21 colonnes. (tab1......tab8)
    chaque colonne de 3 valeurs représente la valeur d'un pixel en RGB.

    ex:
    tab1=
    1 4 7
    2 5 8
    3 6 9

    tab2 =
    10 1 54
    11 2 14
    12 3 87
    J'aimerais pour chaque tableau, en les comparant un à un, savoir si ils ont des pixels en commun.
    Si oui j'incrémente un compteur propre à un tableau (J'ai donc 8 compteur), si non -> rien.
    Ici ces deux tableaux ont un pixel en commun (1,2,3)

    Donc le compteur du premier tableau serait cpt1 = 1, et celui du deuxième serait cpt2 = 1.
    Je veux donc que chaque tableau soit comparé aux 7 autres pour avoir 8 compteurs au final.

    Je pensais donc partir sur une méthode avec des if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(int i = 0; i<21;i++){
        if((tab1[0][i]==tab2[0][i]) && (tab1[1][i]==tab2[1][i]) && (tab1[2][i]==tab2[2][i])){
            cpt1++;
        }
    }
    Mais comme mes tableaux ont des noms différents je devrais faire 7 if pour chaque tableau, donc 56 if :/ Ce qui me fait un code énorme

    Avez-vous une autre solution à me proposer ?

    Merci beaucoup

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    La méthode Arrays.equals(int[], int[]) permet de comparer 2 tableaux : on considère qu'ils sont égaux s'ils ont la même taille et les mêmes valeurs dans le même ordre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int[] a= {1,2,3};
    int[] b= {1,2,3};
    int[] c= {3,2,1};
    System.out.println( Arrays.equals(a, b) );
    System.out.println( Arrays.equals(a, c) );
    Affiche true puis false.

    Si tu fais if ( Arrays.equals(a,b) && Arrays.equals(a,c) ) tu peux tester l'égalité entre 3 tableaux.

    Ensuite, si tu as un tableau à 2 dimensions, c'est comme si c'était un tableau de tableaux, donc tu peux écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int[][] array1 = /*...*;
    int[][] array2 = /*...*/;
     
    boolean eq=false;
    if ( array1.length==array2.length) {
       eq=true;
       for(int i=0; eq && i<array1.length; i++ ) {
             eq = Arrays.equals( array1[i], array2[i] ) ;
       }
    }
    System.out.println("Tableaux égaux : " + eq);
    (Tu as aussi une méthode Arrays.deepEquals() qui fait ça toute seule, mais tu ne pourras pas t'en servir pour compter les pixels en commun).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Par défaut
    Alors merci beaucoup je ne connaissez pas cette méthode je peux essayer de commencer avec ça.

    Cette méthode ne renvoi "True" que si les tableaux ont les valeurs dans le même ordre.

    Pourtant je voudrais que la détection se fasse même si les valeurs sont dans le désordre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int[][] array1 = {{1,2,3},{12,4,5}};
    int[][] array2 = {{1,2,3},{9,4,8}};
    ici j'ai bien un pixel en commun mais ça me renvoi false

    En tout cas merci je vais commencer par chercher dans ce coin là

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 5
    Par défaut
    Une piste intéressante serait de te créer une classe qui représente un pixel et qui contienne les 3 valeurs, pour obtenir 8 tableaux de 21 pixels.
    Ensuite tu peux surcharger la méthode Object#Equals (et Object#hashcode au passage) pour que 2 pixels avec les mêmes valeurs soit considérés comme égales.
    Enfin, tu pourras utiliser la méthode Arrays#binarySearch pour rechercher chaque valeur dans chaque tableau, ou passer sur des List et utiliser List#contains plutôt.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Moux88 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int[][] array1 = {{1,2,3},{12,4,5}};
    int[][] array2 = {{1,2,3},{9,4,8}};
    ici j'ai bien un pixel en commun mais ça me renvoi false
    Non, mais il ne faut utiliser Arrays.equals() que pour le tableau de composantes évidemment. Pour le tableau de pixels, tu es obligé de le parcourir. Là, ça te rend false parce que {12,4,5} est différent de {9,4,8}.

    If faut que tu parcours le premier tableau, et que tu parcours ensuite le second, comme ça, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int[][] array1 = {{1,2,3},{12,4,5}};
    int[][] array2 = {{1,2,3},{9,4,8}};
    for(int i=0; i<array1.length; i++) {
     
          for(int[] pixel2 : array2 ) {
                if ( Arrays.equals(array1[i], pixel2) ) {
                     System.out.println("Le pixel de position " + (i+1) + " dans le premier tableau se trouve aussi dans le second");
                     break;
                }
          }
     
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 110
    Par défaut
    Merci pour vos réponses. Je ne suis pas encore très à l'aise avec les classes je n'en ai qu'une pour le moment. Je vais regarder ducoup merci JohannL

    Et je ne comprends pas ce morceau :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      for(int[] pixel2 : array2 ) {
                if ( Arrays.equals(array1[i], pixel2) ) {
                }
       }
    Je ne savais pas qu'on pouvais initialiser un tableau dans un for
    Ducoup si on traduit ça veut dire ;

    Pour tableau "pixel2" allant de ? à taille tableau array2
    Faire Si l'élément sélectionné est égal au pixel choisi
    Alors (la suite...)

    c'est bien ça ?

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Moux88 Voir le message
    Et je ne comprends pas ce morceau :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      for(int[] pixel2 : array2 ) {
                if ( Arrays.equals(array1[i], pixel2) ) {
                }
       }
    Il s'agit d'un forEach. Pout tout objet "object" itérable de T (dont le type est une classe implémentant directement ou indirectement Iterable<T> ou un tableau T[]), on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(T item : object) {
    }
    Ce qui revient à écrire pour T implémentant Iterable<T> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(Iterator<T> iterator = object.iterator(); iterator.hasNext(); ) {
          T item = iterator.next();
    }
    Et pour un tableau,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i=0; i<object.length; i++) {
        T item = object[i];
    }
    Si T est un tableau de int (soit int[]), ce qui est le cas avec un int[][], qui est un tableau de int[], on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int[][] array = /*...*/
    for(int i=0; i<array.length; i++) {
           int[] ligne = array[i];
    }
    Donc on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int[][] array = /*...*/
    for(int[] ligne : array) {
    }
    Ce qui revient au même, sauf que dans le second cas, on n'a pas de variable i, donc on ne peut connaitre l'index (la position du tableau ligne dans le tableau array). Quand on n'a pas besoin de la connaitre, on peut s'en passer et simplifier l'écriture de la boucle par un forEach.

    D'ailleurs, on peut écrire, de même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int[][] array = /*...*/
    for(int[] ligne : array) {
       for(int valeur : ligne) {
       }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Comment comparer plusieurs tableaux entre eux ?
    Par djibril dans le forum Téléchargez
    Réponses: 2
    Dernier message: 21/08/2012, 14h14
  2. grep extraire plusieurs termes en comparant plusieurs fichiers entre eux
    Par sab113 dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 07/03/2012, 20h03
  3. script shell : comparer 2 répertoires entre eux
    Par Chicna dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 19/09/2011, 19h42
  4. Comparer 2 picturebox entre eux
    Par offspring dans le forum C#
    Réponses: 4
    Dernier message: 18/04/2008, 20h13
  5. Filtrer une table en comparant deux champs entre eux
    Par damene dans le forum Débuter
    Réponses: 13
    Dernier message: 12/04/2008, 20h10

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