Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1447 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Tableau [][] : vérifier qu'il n'y a pas de ligne identique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tableau [][] : vérifier qu'il n'y a pas de ligne identique

n°1861355
kakashii
Posté le 13-03-2009 à 19:32:22  profilanswer
 

Salut!
Je cherche à faire une petite fonction qui vérifiera qu'il n'y ai pas de lignes identiques dans un tableau à 2 dimensions.
 
Par exemple si tab[0] == tab[2] ou tab[0] == tab[1]...  ca renvoie un booléen true
 
je réfléchis depuis un moment et j'arrive pas à trouver, malgré des for et encore des for...  
 
j'ai fais ca pour l'instant
 

Code :
  1. boolean testLigne(){
  2.      boolean test=false;
  3.      for( int i=0 ; i< n-1; i++ )
  4.         for( int k=0 ; k< n-1; k++ )
  5.           for (int j=0 ; j< n;j++)
  6.              if(i!=k && tab[i][j]==tab[k][j])
  7.                 test=true;
  8.   return test;
  9. }


 
n c'est la taille du tableau (tableau carré tab[n][n])
 
Quelqu'un a une idée ?

mood
Publicité
Posté le 13-03-2009 à 19:32:22  profilanswer
 

n°1861372
Redfield
Posté le 13-03-2009 à 21:20:19  profilanswer
 

Hello,
 
Débutant en Java, je ne pense pas qu'il faille comparer les valeurs de cette manière. Si tu fais tab[0] == tab2[0], tu cherches à savoir si les variables pointent sur la même adresse. Pour moi si tu veux comparer les 2 valeurs, tu dois faire tab[0].equals(tab2[0]) là il va te retourner true.
 
Je pense que des personnes confirmées pourront affirmer ou infirmer cela.
 
Cordialement,
Redfield
 

kakashii a écrit :

Salut!
Je cherche à faire une petite fonction qui vérifiera qu'il n'y ai pas de lignes identiques dans un tableau à 2 dimensions.
 
Par exemple si tab[0] == tab[2] ou tab[0] == tab[1]...  ca renvoie un booléen true
 
je réfléchis depuis un moment et j'arrive pas à trouver, malgré des for et encore des for...  
 
j'ai fais ca pour l'instant
 

Code :
  1. boolean testLigne(){
  2.      boolean test=false;
  3.      for( int i=0 ; i< n-1; i++ )
  4.         for( int k=0 ; k< n-1; k++ )
  5.           for (int j=0 ; j< n;j++)
  6.              if(i!=k && tab[i][j]==tab[k][j])
  7.                 test=true;
  8.   return test;
  9. }


 
n c'est la taille du tableau (tableau carré tab[n][n])
 
Quelqu'un a une idée ?


n°1861387
el muchach​o
Comfortably Numb
Posté le 13-03-2009 à 22:28:12  profilanswer
 

Tout dépend de quoi est le tableau. Si ce sont des types primitifs, il faut utiliser ==. Si ce sont des objets, il faut utiliser .equals.

 

Sinon, pour l'algo: si le tableau est petit (disons N < 100 lignes), des boucles imbriquées iront. S'il est grand, la complexité est en O(N^2). Un algo simple est alors de faire un tri des lignes (il faut trouver une relation d'ordre entre les lignes rapide) et de repérer d'éventuels doublons en comparant les lignes successives 2 à 2. Pour la comparaison entre 2 lignes, il faut évidemment quitter au premier élément qui diffère.

Message cité 1 fois
Message édité par el muchacho le 13-03-2009 à 22:39:34
n°1861388
post_it
Hmmmm!...
Posté le 13-03-2009 à 22:28:44  profilanswer
 

Hello!Plusieurs remarques:  
1) Ton indice "k" n'a pas besoin de varier de 0 à n-2, il devrait plutôt aller de (i+1) à (n-1).  
2) La logique de ton "if" n'est pas la bonne. Ton booléen "test" va devenir "true" dès qu'un seul nombre est identique dans les deux lignes que tu compares. Ce n'est pas bon car tu veux que "test" devienne "true" si et seulement si tous les entiers sont identiques. Il faudrait plutôt faire l'inverse: au début, tu supposes que les lignes seront identiques, et "test" va devenir "false" dès qu'un seul nombre est différent dans les deux lignes.  
3) Il faudra penser à réinitialiser "test" à chaque nouvelle comparaison de deux lignes.


Message édité par post_it le 13-03-2009 à 22:29:32
n°1861441
kakashii
Posté le 14-03-2009 à 09:50:34  profilanswer
 

el muchacho a écrit :

Tout dépend de quoi est le tableau. Si ce sont des types primitifs, il faut utiliser ==. Si ce sont des objets, il faut utiliser .equals.
 
Sinon, pour l'algo: si le tableau est petit (disons N < 100 lignes), des boucles imbriquées iront. S'il est grand, la complexité est en O(N^2). Un algo simple est alors de faire un tri des lignes (il faut trouver une relation d'ordre entre les lignes rapide) et de repérer d'éventuels doublons en comparant les lignes successives 2 à 2. Pour la comparaison entre 2 lignes, il faut évidemment quitter au premier élément qui diffère.


 
ce sont des double en fait ;)
 
merci pour vos remarques
 
post_it j'ai modifié un peu le code avec ce que t'as dis, apparemment pour l'instant ça marche toujours pas
 

Code :
  1. boolean testLigne(){
  2.  boolean test=true;;
  3.  for( int i=0 ; i< n-1; i++ ){
  4.   for( int k=i+1 ; k< n; k++ )
  5.    for (int j=0 ; j<n;j++)
  6.     if(tab[i][j]!=tab[k][j])
  7.      test=false;
  8.  if(test)
  9.   return test;
  10.  }
  11.  return test;
  12. }


 
c'est bizarre, ca marche toujours pas ! Pourtant ça parait bon  :??:


Message édité par kakashii le 14-03-2009 à 10:10:09
n°1861482
kakashii
Posté le 14-03-2009 à 13:08:06  profilanswer
 

J'ai mis un affichage et ça marche pas, je comprend pas la  :??:  
 

Code :
  1. boolean testLigne(){
  2.  boolean test=true;
  3.  for( int i=0 ; i< n-1; i++ ){
  4.       test=true;
  5.       for( int k=i+1 ; k< n; k++ ){
  6.        for (int j=0 ; j<n;j++)
  7.         if(tab[i][j]!=tab[k][j])
  8.          test=false;
  9.        if(!test)
  10.          System.out.println("ligne "+i+" différente de ligne "+k);
  11.        else
  12.         System.out.println("ligne "+i+" égale à ligne "+k);
  13.       }
  14.       if(test)
  15.          return test;
  16.  }
  17.  return test;
  18. }


 
edit : apres quelques tests encore, ça marche seulement quand les lignes se suivent !


Message édité par kakashii le 14-03-2009 à 13:11:26
n°1861505
post_it
Hmmmm!...
Posté le 14-03-2009 à 15:15:33  profilanswer
 

Je pense qu'il faut déplacer la ligne "test=true;"
 

Code :
  1. boolean testLigne(){
  2. boolean test=true;
  3. for( int i=0 ; i< n-1; i++ ){
  4.     for( int k=i+1 ; k< n; k++ ){
  5.        test=true;
  6.        for (int j=0 ; j<n;j++)
  7.         if(tab[i][j]!=tab[k][j])
  8.          test=false;
  9.        if(!test)
  10.          System.out.println("ligne "+i+" différente de ligne "+k);
  11.        else
  12.         System.out.println("ligne "+i+" égale à ligne "+k);
  13.       }
  14.       if(test)
  15.          return test;
  16. }
  17. return test;
  18. }


Message édité par post_it le 14-03-2009 à 15:19:13
n°1861511
kakashii
Posté le 14-03-2009 à 15:40:08  profilanswer
 

Ah oui bien vu!
Je vous remercie ! Ca a l'air de marcher parfaitement :)

n°1861541
post_it
Hmmmm!...
Posté le 14-03-2009 à 18:30:16  profilanswer
 

De rien !  :)

n°1861991
Bidem
Posté le 16-03-2009 à 09:29:20  profilanswer
 

Il y a une méthode pour comparer 2 tableaux de booléens dans la classe java.util.Arrays : equals(double[] a, double[] a2)

 

Comme précisé, ça n'utilise pas == pour comparer les valeurs : pour bien gérer les valeurs NaN et -0.0d, ça créé des instances de Double donc c'est plus gourmand.
Si dans ton cas, tu n'as pas ces cas particuliers, il vaut mieux garder ta méthode


Message édité par Bidem le 16-03-2009 à 09:32:44

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Tableau [][] : vérifier qu'il n'y a pas de ligne identique

 

Sujets relatifs
MVC sur un tableau[Résolu] Fonction retournant un tableau allouer dynamiquement
Boutique en ligne, solution e-commerce : osCommerce ou autre ?Aide pour la programmation d'un userform remplissant une ligne Excel
[Graphique] Modifier la taille d'un tableauSurligner une ligne d'un paragraphe au passage de la souris
[Résolu] Problème de CSS sur un tri ajax d'un tableauEXCEL : Beaucoup de SI ... Tableau d'ammortissement.
verifier mdp[Access] Regrouper plusieurs résultats d'1 requête sur 1 seule ligne?
Plus de sujets relatifs à : Tableau [][] : vérifier qu'il n'y a pas de ligne identique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR