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

Messages postés
4
Date d'inscription
jeudi 29 novembre 2018
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 

Votre réponse

3 réponses

Messages postés
15854
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 décembre 2018
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
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
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
5298
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
3 décembre 2018
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
15854
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 décembre 2018
-
"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
5298
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
3 décembre 2018
-
Oui, c'est même mieux.
Commenter la réponse de Twinuts
Messages postés
4
Date d'inscription
jeudi 29 novembre 2018
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.