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

JavaScript Discussion :

Nombre d'éléments communs entre deux tableaux


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut Nombre d'éléments communs entre deux tableaux
    bonjour,
    étant donné deux tableaux de nombres entiers, j'aimerais trouver le nombre d'éléments communs entre les deux tbleaux:
    exemple
    nbcommun([1,2,1,3,4],[1,5,4,6]=2)
    voici mon code:
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var nbcommun = function(tab1,tab2){
     
        var n=0;                                
        var n1=tab1.length;					    
        var n2=tab2.length;					    
        for(var i=0;i<n1;i++){
            for(var j=0;j<n2;j++){
                if(tab1[i]==tab2[j]){
                    n++;
                    break;
                }
            }
        }
        return n;
    };

    mon code marche bien quand il n'y a pas de doublons, par contre avec les doublons ca ne marche pas
    merci de me donner des idées

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Pour plus d'efficacité et un code de comparaison plus simple, je te conseille de trier tes deux tableaux.

    Qu'entends-tu par doublon ? Par exemple deux fois X dans le premier tableau et une foix X dans le second, le résultat devrait être quoi ?

    Sinon, ne serait-ce pas du Javascript ? Car ici, c'est le forum Java, ce qui n'a rien à voir...

    EDIT : OK message déplacé
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    merci pour cette réponse rapide
    oui c'est ca quand il y a deux fois x dans le premier et x dans le deuxième je veut que le résultat soit 1 et non pas 2 ce que me donne mon code
    d'autre part on a pas encore vu le tri de tableaux, donc je ne peux pas l'utiliser

    ps: oui c du java script!

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2006
    Messages : 226
    Points : 532
    Points
    532
    Par défaut
    salut,

    dans tes boucles il faut que tu gères les fait que tu sois déjà passé sur un élément ou non.

    tu as plusieurs solutions, soit tu boucles une première fois sur tes deux tableaux pour enlever les doublons au sein du même tableau, sois tu stock les éléments sur lesquels tu es déjà passé pour ne pas les recompter.

    exemple:
    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
     
    var nbcommun = function(tab1, tab2) {
        var n = 0;
        var traites = [];
        var traites2 = [];
     
        tab1.forEach(function(item, i, arr) {
            if(traites.indexOf(item) != -1) return; //on test si on a deja traiter ce chiffre
     
            tab2.forEach(function(item2, i2, arr2) {
                if(traites2.indexOf(item2) != -1) return; //on test si on a deja traiter ce chiffre dans le 2eme tab
                if(item == item2) {
                    n++;
                    traites2.push(item2); //on rajoute le chiffre traiter afin de ne pas le traiter de nouveau
                }
            });
     
            traites.push(item); //on rajoute le chiffre traiter afin de ne pas le traiter de nouveau
        });
     
        return n;
    };
     
    console.log(nbcommun([1,2,1,3,4],[1,1,1,5,4,6])); //2
    console.log(nbcommun([1,2,3,4],[1,5,4,6])); //2
    console.log(nbcommun([2,3,4],[1,5,4,6])); //1
    console.log(nbcommun([1,2,3,4],[5,6])); //0
    y a surement moyen d'optimiser encore tout ça, mais c'est l'idée

  5. #5
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Salut !
    Tu cherches une fonction d'intersection. Voici une implémentation possible :

    Code javascript : 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
    /*
     * @name intersection
     * @description Retourne la liste (sous forme de tableau Array) des éléments communs aux tableaux x et y
     *
     * @param {Array} x - 1er tableau
     * @param {Array} y - 2ème tableau
     *
     * @return {Array} res - intersection de x et y
     */
    function intersection(x, y) {
      'use strict';
     
      var i = 0,
          j = 0, 
          res = [],
          xLen = x.length,
          yLen = y.length;
     
      x.sort();
      y.sort();
     
      while (i < xLen && j < yLen) {
        if (x[i] < y[j]) {
          i++;
        } else if (y[j] < x[i]) {
          j++;
        } else {
          res.push(x[i]);
          i++;
          j++;
        }
      }
     
      return res;
    }
     
    var a = intersection([1,2,1,3,4], [1,5,4,6]);
    console.log(a); // [1, 4]
    console.log(a.length); // 2

  6. #6
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    @Kaamo : et la version 140 caractères donne quoi ?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    merci pour vos réponses,
    Effectivement je cherche une intersection, mais je n'ai pas le droit de déclarer un tableau dont je ne connais pas la taille d'où le calcul du nombre d'éléments communs et je n'ai pas le droit non plus d'utiliser la fonction "push";

  8. #8
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pour le fun. (uniquement avec FF, qui prends en charge les fonctions fléchées)

    function it(x,y){var c=0,o=0; x.sort((a,b) => {return a - b;}).forEach(i => { if (i>o){ if(y.indexOf(i) >= 0) c++; } o=i }); return c; }

    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2006
    Messages : 226
    Points : 532
    Points
    532
    Par défaut
    au vue de ta dernière réponse, ton problème semble être un exo donné par un prof...

    si c'est ça, faudrait peut-être nous dire quelles sont les limites... même si sincèrement je ne vois pas le problème de déclarer un tableau vide ou d'utiliser "push".

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    exactement et les limites c'est qu'on a pas encore vu ni la fonction push ni le tri de tableaux.
    finalement j'ai trouvé ceci, apparemment ca marche, vous me direz si on peut l'améliorer
    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
    var nbcommun = function(tab1,tab2){
        var test=false;		
        var n=0;                                
       	for(var i=0;i<tab1.length;i++){	      // on parcours le premier tableau
            for(var k=i+1;k<tab1.length;k++){ // on boucle sur le reste du tableau
                if(tab1[i]==tab1[k]){	      // est ce que ce nombre se répète dans le tableau
                    test=true;
                    break;
                }
                else test=false;
            }
            if(test==false){				   // si un numéro ne se répète pas on incrémente
                for(var j=0;j<tab2.length;j++){// sinon on incrémente seulement quand on arrive
                    if(tab1[i]==tab2[j]){	   //  au dernier numéro de la répétition.
                        n++;
                        break;				  // on sort dès qu'on trouve le premier nombre commun.
                    }    
                }
            }
       }
       return n;
    };

  11. #11
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Comme je disais à mon collègue, imagine si les autres métier prenais exemple sur nous.

    J'imagine le chirurgien avec un bout de scotch au bloc : "finalement j'ai trouvé ceci, apparemment ca marche".

    m'enfin...
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 45
    Points : 9
    Points
    9
    Par défaut
    ca fait l'affaire c'est l'essentiel lol

  13. #13
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Bonjour,
    @Kaamo : et la version 140 caractères donne quoi ?


    119 sans trop optimiser
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function intersect(x,y){
    for(x.sort(y.sort(i=j=0,r=[]));i<x.length&&j<y.length;(x[i]<y[j]&&i++)||(y[j]<x[i]&&j++)||r.push(x[i++])&&j++);return r
    }([1,2,1,3,4],[1,5,4,6]))

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Si c'est un exercice ce n'est pas forcément pertinent de chercher la solution sur le Net…

    @Golgotha : pas besoin de return avec les fonctions fléchées. Tant qu'on est sous FF, on rajoute un let ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var it = (x, y) => let (c=0, o=0) x.sort((a,b) => a-b).forEach(i => i>o && y.indexOf(i) >= 0 && c++, o=i), c;
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Si c'est un exercice ce n'est pas forcément pertinent de chercher la solution sur le Net…

    @Golgotha : pas besoin de return avec les fonctions fléchées. Tant qu'on est sous FF, on rajoute un let ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var it = (x, y) => let (c=0, o=0) x.sort((a,b) => a-b).forEach(i => i>o && y.indexOf(i) >= 0 && c++, o=i), c;
    nice
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  16. #16
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Que pensez-vous de la solution proposée par la librairie phpjs ? http://phpjs.org/functions/array_intersect/

    Et si c'est pas trop HS d'ailleurs, que pensez-vous de cette librairie ?
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  17. #17
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Cette fonction ne traite pas les doublons :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var a = array_intersect([1,2,1,3,4], [1,5,4,6]);
    console.log(a); //  Object {0: 1, 2: 1, 4: 4}

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

Discussions similaires

  1. [XL-2007] Recherche de commun entre deux tableaux
    Par louqui dans le forum Excel
    Réponses: 8
    Dernier message: 23/07/2014, 17h29
  2. trouver les éléments communs entre deux vecteurs
    Par Décembre dans le forum MATLAB
    Réponses: 5
    Dernier message: 21/07/2010, 09h38
  3. Réponses: 49
    Dernier message: 26/05/2010, 21h58
  4. Réponses: 15
    Dernier message: 17/06/2006, 11h49

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