Suppression de doublons dans un tableau de string [Résolu]

Messages postés
4
Date d'inscription
jeudi 29 novembre 2018
Statut
Membre
Dernière intervention
30 novembre 2018
-
Salut à tous, je souhaite supprimer les doublons dans un tableau de chaines de caractères.Mon code est le suivant :
public class TableauSansDoublon{
 public static void main (String [] args){
  String [] tableau ={"a", "c", "b", "bc", "a", "bc", "e", "f", "e", "a", "fe", "a", "f", "e", "e","ef", "fe"};
  
 //affichage du tableau avec les doublons
System.out.println("Le tableau avant suppression de doublon");
  for (int i=0; i < tableau.length; i++){
   System.out.print(tableau[i] + " ");
  }
  System.out.println();
  
 //compter le nombre d éléments differents du tableau 
     int taille =tableau.length;
  for(int i=0; i < tableau.length; i++){
    for(int j=i+1; j<tableau.length; j++){
     if((tableau[i]).equals(tableau[j])){
      taille--;
      break;
     }
    }
  }
System.out.println("le nombre d elements different est " + taille);
  System.out.println();
  
//suppression des doublons
//tableau sans doublons 
String  [] tableauSingulier=new String [taille];
   
   int nombreChaineDifferent=0; 
   int nombreDoublon=0;
   
 
for (int i=0; i < tableau.length ; i++ ){
     
 for (int j=0; j < tableauSingulier.length ; j++){
   if (tableau[i].equals(tableauSingulier[j])){
      nombreDoublon++;
   }
    else {
       tableauSingulier[nombreChaineDifferent]=tableau[i];
  nombreChaineDifferent++;
     }
     
   }
     
     
  }
 //affichage tableau sans doublon
 for (int i=0; i < tableauSingulier.length; i++){
    System.out.print(tableauSingulier[i] + " ");
     }
     
 }
}


ce code me genère une erreur java.lang.arrayindexoutofboundsexception 8.
Merci à vous de m'aider à corriger cette erreur.
Afficher la suite 

4 réponses

Messages postés
16034
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
13 octobre 2019
88
0
Merci
Bonjour,

Le problème c'est ta double boucle :
for (int i = 0; i < tableau.length; i++) {
    for (int j = 0; j < tableauSingulier.length; j++) {

Tu devrais ajouter 0 ou 1 valeur dans le tableauSingulier pour chaque i, mais ici tu vas en mettre jusqu'à 8 (tableauSingulier.length) pour chaque i à cause de ta boucle sur j...

Si le tableau était assez grand, ton code essaierais de rajouter 112 cases à ton tableau, mais il ne contient que 8 cases (de 0 à 7), donc quand il arrive à la case 8, il plante.
mosesDeParis
Messages postés
4
Date d'inscription
jeudi 29 novembre 2018
Statut
Membre
Dernière intervention
30 novembre 2018
-
Bonjour KX, Merci à toi de me répondre.
Comment je pourrais mettre 0 ou une seule valeur dans le tableauSingulier.
Merci!
mosesDeParis
Messages postés
4
Date d'inscription
jeudi 29 novembre 2018
Statut
Membre
Dernière intervention
30 novembre 2018
-
j ai modifié le code au niveau de la double boucle for comme ceci.
//suppression des doublons
  
  String  [] tableauSingulier=new String [taille];//tableau sans doubblons
   
   
   
 tableauSingulier[0]=tableau[0];
   int position=1;
  boolean b=false;
  for(int i=1; i < tableau.length; i++){
    for (int j=0; j < position  ; j++){
     if ((tableauSingulier[j].equals(tableau[i]))){

      b=true;
      break; 
     } 
    }
    
    if(b==false){
     tableauSingulier[position]=tableau[i]; 
     position++;
    }
  }

ce code me génère des valeurs nulles à partir du premier doublon rencontré.
Commenter la réponse de KX
Messages postés
5340
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
3 septembre 2019
85
0
Merci
Salut,

Sinon au plus simple utilise la classe 'Set':
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
...
String [] tableau ={"a", "c", "b", "bc", "a", "bc", "e", "f", "e", "a", "fe", "a", "f", "e", "e","ef", "fe"};
Set<String> set = new HashSet<>(Arrays.asList(tableau));
tableau = set.toArray(new String[] {});
for(String s : tableau)
  System.out.println(s);


KX
Messages postés
16034
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
13 octobre 2019
88 -
"Au plus simple" il y a les Stream ;-)

Stream.of("a","c","b","bc","a","bc","e","f","e","a","fe","a","f","e","e","ef","fe")
    .distinct()
    .forEach(System.out::println);
Twinuts
Messages postés
5340
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
3 septembre 2019
85 -
Oui, c'est même mieux.
Commenter la réponse de Twinuts
Messages postés
4
Date d'inscription
jeudi 29 novembre 2018
Statut
Membre
Dernière intervention
30 novembre 2018
0
Merci
Bonjour .Merci encore à vous de m'avoir donner des solutions.J'ai trouvé la solution avec mon deuxième code et c est la suivante
String  [] tableauSingulier=new String [taille];//tableau sans doubblons
     
 tableauSingulier[0]=tableau[0];
   int position=1;
  
  for(int i=1; i < tableau.length; i++){
   boolean b=false;
    for (int j=0; j < position  ; j++){
     if ((tableauSingulier[j].equals(tableau[i]))){

      b=true;
      break; 
     } 
    }
    
    if(b==false){
     tableauSingulier[position]=tableau[i]; 
     position++;
    }
  }
     //affichage tableau sans doublon
     for (int i=0; i < tableauSingulier.length; i++){
      System.out.print(tableauSingulier[i] + " ");
     }
     
  
 }

Merci infiniment à vous.
Commenter la réponse de mosesDeParis
Commenter la réponse de MRx