éviter la redondance et regrouper la resultat

Résolu/Fermé
nidhalos Messages postés 11 Date d'inscription vendredi 11 mai 2018 Statut Membre Dernière intervention 4 mai 2019 - Modifié le 11 mai 2018 à 08:26
 nidhalos - 11 mai 2018 à 16:09
bonjours à tous,
je fait une comparaison entre les différentes éléments de trois matrices et je mis la résultat dans une chaîne de caractère et j'ai obtenue la résultat suivante:

public static void coparaison() {
   String [][] tab1 = {{"hello","world"},{"bonjours","hey"}};
   String [][] tab2 = {{"hi","hey"},{"world","test"}};
   String [][] tab3 = {{"bonsoir","j"},{"test","hey"}};
   String s = "";
   for (int i=0; i<tab1.length; i++)
   {
    for (int w=0; w<=1; w++)
    {
     for (int j=0; j<tab2.length; j++)
     {
      for (int e=0; e<=1; e++)
      {
    
    if (tab1[i][w]==tab2[j][e])
    {
     switch (w)
     {
    
     case (0) :  
      if(e==0) 
      {s = tab1[i][1]+"="+tab2[j][1]+"/ \n"+s;}
    
      if(e==1) 
     {s = tab1[i][1]+"="+tab2[j][0]+"/ \n"+s;}
     break;
     case (1) : 
      
      if(e==0) 
      {s = tab1[i][0]+"="+tab2[j][1]+"/ \n"+s;}
    
      else if(e==1) 
     {s = tab1[i][0]+"="+tab2[i][0]+"/ \n"+s;}
     break;  
     } } }} 
         for (int j=0; j<tab3.length; j++)
        {
         for (int e=0; e<=1; e++)
         {
       
       if (tab1[i][w]==tab3[j][e])
       {
        switch (w)
        {
       
        case (0) :  
         if(e==0) 
         {s = tab1[i][1]+"="+tab3[j][1]+"/ \n"+s;}
       
         if(e==1) 
        {s = tab1[i][1]+"="+tab3[j][0]+"/ \n"+s;}
        break;
        case (1) : 
         
         if(e==0) 
         {s = tab1[i][0]+"="+tab3[j][1]+"/ \n"+s;}
       
         else if(e==1) 
        {s = tab1[i][0]+"="+tab3[i][0]+"/ \n"+s;}
        break;   
        } 
       } }} } }   
   
   for (int i=0; i<tab2.length; i++)
   {
    for (int w=0; w<=1; w++)
    {
     for (int j=0; j<tab3.length; j++)
     {
      for (int e=0; e<=1; e++)
      {
    
    if (tab2[i][w]==tab3[j][e])
    {
     switch (w)
     {
    
     case (0) :  
      if(e==0) 
      {s = tab2[i][1]+"="+tab3[j][1]+"/ \n"+s;}
    
      if(e==1) 
     {s = tab2[i][1]+"="+tab3[j][0]+"/ \n"+s;}
     break;
     case (1) : 
      
      if(e==0) 
      {s = tab2[i][0]+"="+tab3[j][1]+"/ \n"+s;}
    
      else if(e==1) 
     {s = tab2[i][0]+"="+tab3[i][0]+"/ \n"+s;}
     break;  
     }
   
    } }} }}
   
   
System.out.println(s);
 }
 
 }


world=hey/
hi=bonsoir/
bonjours=test/
bonjours=world/
hello=test/

en suite ,veux faire une comparaison pour chaque avec l’élimination des redondances pour obtenir la resultat suivante :


world=hey/
hi=bonsoir/
bonjours=world=test/
hello=test/


Est ce que quelqu'un pourrait m'aider svp ?
et merci

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 mai 2018 à 09:33
Bonjour,

Déjà il ne faudrait jamais comparer deux objets avec l'opérateur
==
car cela ne compare pas leur valeur mais leur référence. Ici tu es dans un cas particulier où toutes tes valeurs sont écrites en dures dans le code, donc ça marche, toutes ces String partagent la même référence, mais si tu entrais tes valeurs au clavier ça ne fonctionnerait plus.
Pour comparer la valeur de deux objets, il faut utiliser la méthode equals →
if (tab1[i][w].equals(tab2[j][e]))


Ensuite, si tu travailles avec des matrices en entrée, il serait cohérent d'avoir une matrice en sortie.
Ici tu as un String en sortie, donc forcément ça va être compliqué d'appliquer le même traitement alors que tu n'as plus de matrice à traiter...

Par contre, tu as écrit en dur des
case(0)
,
case(1)
,
if(e==0)
,
if(e==1)
,
tab1[i][0]
et
tab2[j][1]
mais tout ça ne fonctionnera que si tes matrices sont de tailles 2x2, dès que tu passeras à des tailles supérieures ton code ne prendra pas en compte les autres lignes et colonnes. Quand on programme, il faut toujours penser au cas général.

Sur le même principe, je pense que c'est une erreur de faire un code spécifique à la comparaison de 3 matrices, tu devrais généraliser pour que ça fonctionne avec 2, 3, 4... 150 matrices.
Au final, cela reviendrait un peu à traiter non plus des
String[][]
mais des
String[][][]
...
Remarque : je ne suis pas sûr que les tableaux soient les structures de données les plus pertinentes, est-ce que tu as déjà manipulé des List, Set ou Map ? Ce serait peut-être utile ici.

Et tant qu'à modifier le code, il n'y a pas de raison de se limiter à des String, tu devrais pouvoir généraliser ton programme avec tous types d'objets Java, il n'y a rien de spécifiques aux String dans ton traitement.

Pour la clarté du code maintenant, je t'invite à utiliser des noms de variables plus explicites.
Par exemple
if (tab1[row1][col1] == tab2[row2][col2])
c'est mieux que ton
if (tab1[i][w] == tab2[j][e])
.
On comprends tout de suite que
col1
est lié aux colonnes de
tab1
, c'est nettement moins évident avec
w
...

Remarque : je n'ai pas du tout compris ton calcul et ton résultat.
Si je ne regarde que la première partie avec tab1 et tab2, ça donne ceci.

tab1:
helloworld
bonjourshey

tab2 :
hihey
worldtest

résultat :
bonjours = world
hello = test

Est-ce que tu pourrais expliquer à quoi correspond ce résultat ?

De plus, tu as indiqué vouloir obtenir au final "bonjours=world=test", pourquoi deux signes égal dans la même ligne ?
2
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 mai 2018 à 12:18
Remarque : dans ton code il doit y avoir des erreurs de copier-coller (que je n'ai pas cherché)

En effet, le résultat devrait être similaire en changeant l'ordre des tableaux, mais ce n'est pas le cas.

String[][] tab1 = { { "hello", "world" }, { "bonjours", "hey" } };
String[][] tab2 = { { "hi", "hey" }, { "world", "test" } };
String[][] tab3 = { { "bonsoir", "j" }, { "test", "hey" } };
world=hey/ 
hi=bonsoir/
bonjours=test/
bonjours=world/
hello=test/

Ici j'inverse les deux premiers tableaux :
String[][] tab2 = { { "hello", "world" }, { "bonjours", "hey" } };
String[][] tab1 = { { "hi", "hey" }, { "world", "test" } };
String[][] tab3 = { { "bonsoir", "j" }, { "test", "hey" } };
bonjours=test/ 
world=hey/
test=hello/
hi=bonsoir/
hi=hello/
Juste en changeant l'ordre des tableaux dans un résultat j'ai "bonjours=world" et dans l'autre "hi=hello" ça me semble incorrect.

En reprenant ton code, cette version devrait simplifier ton programme :

public static void main(String[] args) {
    String[][] tab1 = { { "hello", "world" }, { "bonjours", "hey" } };
    String[][] tab2 = { { "hi", "hey" }, { "world", "test" } };
    String[][] tab3 = { { "bonsoir", "j" }, { "test", "hey" } };
    String[][][] tabs = { tab1, tab2, tab3 };
    String result = comparaison(tabs);
    System.out.println(result);
}

public static String comparaison(String[][][] tabs) {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < tabs.length; i++)
        for (int j = i + 1; j < tabs.length; j++)
            comparaison(result, tabs[i], tabs[j]);
    return result.toString();
}

public static void comparaison(StringBuilder result, String[][] tab1, String[][] tab2) {
    for (int row1 = 0; row1 < tab1.length; row1++)
        for (int col1 = 0; col1 < 2; col1++)
            for (int row2 = 0; row2 < tab2.length; row2++)
                for (int col2 = 0; col2 < 2; col2++)
                    if (Objects.equals(tab1[row1][col1], tab2[row2][col2]))
                        result.append(tab1[row1][1 - col1]).append("=").append(tab2[row2][1 - col2]).append("\n");
}
0
nidhalos Messages postés 11 Date d'inscription vendredi 11 mai 2018 Statut Membre Dernière intervention 4 mai 2019
11 mai 2018 à 15:12
j'ai tois matrices de type string :tab1[i][1];tab2[j][1];tab2[j][1] comme entré, mon objectif :
1) c'est de compare chaque élément de matrice X par les autres éléments de matrice différente :
(tab1[i][w].equals(tab2[j][e]))
et
(tab1[i][w].equals(tab3[j][e]))
et
(tab1[i][w].equals(tab2[j][e]))
.
2) en suit je doit parcourir et filtre le résultat obtenue de cette maniéré :
si on a cette résultat :

ab=abc
at=ar
af=abc
ac=mj
...

elle doive être comme sa:

ab=abc=af ( une seul abc :et jointure les deux ligne dans un seul ligne)
at=ar
ac=mj
...
j'ai déjà résoudre la problème 1 : comparaison matrice mais je trouver une difficulté dans la partie filtrage
0
ça c'est une petite exemple pour explique mon problème .
réellement cette une petite d'un algorithme plus complexe ;
oui je obligé de faire une truc pour filtre la résultat de comparaison ( votre solution de comparaison est parfait merci bien )
mes matrices sont de taille [..][1] et j' ai été oblige de faire une truc pour filtres la résultat de comparaison .
pour la signe "=" je suis oblige de faire deux signes dans la cas "bonjours=world=test" : si et seulement si :j'ai ( j'ai une chaîne de caractère en commun dans deux lignes différant :

bonjours=word
word=test

ou bien

bonjours = test
test = word
ou bien

bonjours = test
bonjours = word

( selon mes matrices j'ai pas le cas de trouver une string dans plus que deux lignes différentes ( max 2) )
0