Supprimer les doublons dans un tableau [Résolu]

Signaler
Messages postés
34
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
5 juillet 2007
-
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
-
   Bonjour, je possede un tableau de string : tab
   Celui ci contient des chaines de caracteres et je voudrais supprimer toutes celles qui sont identiques et remonter l'ensemble du tableau de maniere a ne pas avoir de blanc a la place des doublons supprimés

   il faut savoir que toutes les chaines identiques sont à la suite les une des autres !!

Ex :

tab[0] = a
tab[1] = a
tab[2] = a
tab[3] = b
tab[4] = b
tab[5] = c

--> je souhaiterais que cela devienne :

tab[0] = a
tab[1] = b
tab[2] = c

merci de votre aide
A voir également:

14 réponses

Messages postés
406
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
29 juin 2009
2
Et pourquoi ne pas passer par un HashSet ??? tableau qui ne comtient pas de doublon?

lafolle
Messages postés
406
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
29 juin 2009
2
Salut Ombitious
Ne pense tu pas qu'au lieu de faire le ArrayList, il devrait faire un HashSet, comme çà il s'évite toute la phase de recherche des doublons ? non ?
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

Tu as raison, de plus c'est automatique.
Tu as tout le mérite pour cette solution simpliste.

String [] tokens = {"papa", "papa", "maman", "maman"};

ArrayList<String> al = new ArrayList<String> ();
for (String s : tokens)
    al.add (s);

HashSet hs = new HashSet (al);

Iterator it = hs.iterator ();
for (; it.hasNext (); ) {
    String s =
(String)it.next ()


    System.out.println (s);  
}



C'est testée 100 % ...
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

Lafolle24320 >> Tu as encore parfaitement raison essentiellement pour 2 choses:

1. en C/C++, Pascal ou dans toute autre langage procédurale:
On décremente la taille du tableau après chaque décalage, ici en java c'est impossible. (length--)

2. Prendre la chaine vide "" comme marqueur pour effacer les doublons n'est pas une solution générique mais plutôt étroite comme solution, et si le tableau contient cette chaine vide "" quelle chaine choisir pour effacer les doublons sans que que cette dernière ne figure déja dans le tableau.
Les choses tend à devenir complexes alors qu'elles ne le sont pas en réalité.

J'espère avoir était clair.
Messages postés
34
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
5 juillet 2007

il s'avere en fait que les chaines identiques NE sont PAS à la suite les une des autres mais placé de maniere aléatoire!!


dsl
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

Il suffit de faire:

String [] tokens = {"...", "....", ....};

ArrayList<String> result = ArrayList<String> ();
for (String e : tokens) {
    result.add (e);
}

Collections.sort (result);

for (int i = 0; i < result.size () - 1; ++i) {
    int j = i + 1;
    while (result.get (i).equals (result.get (j)) == 0) {
       result.remove (j);
       ++j;
    }
}

int n;tokens new String [n result.size ()];
for (int i = 0; i < n; ++i) {
    tokens [i] = result.get (i);
}

// Fin
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

Si tu travailles avec JDK 1.4:

import java.util.*;


String [] tokens = {"...", "....", "", "", ""};

ArrayList result = ArrayList ();

for (int i = 0; i < tokens.length; ++i) {
    result.add (tokens [i]);
}

Collections.sort (result);

for (int i = 0; i < result.size () - 1; ++i) {
    int j = i + 1;
    while (((String)result.get (i)).equals (((String)result.get (j))) == 0) {
       result.remove (j);
       ++j;
    }
}

tokens = new String [result.size ()];
for (int i = 0; i <
result.size ()
; ++i) {
    tokens [i] = (String)result.get (i);
}
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

Dernière correction (ICA)

JDK 1.4


import java.util.*;


String [] tokens = {"...", "....", "", "", ""};

ArrayList result = new ArrayList ();

for (int i = 0; i < tokens.length; ++i) {
    result.add (tokens [i]);
}

Collections.sort (result);

for (int i = 0; i < result.size () - 1; ++i) {
    int j = i + 1;
    while (((String)result.get (i)).equals ((String)result.get (j))) {
       result.remove (j);
       ++j;
    }
}

tokens = new String [result.size ()];
for (int i = 0; i <
result.size ()
; ++i) {
    tokens [i] = (String)result.get (i);
}








JDK 1.5 ou plus


String [] tokens = {"...", "....", ....};

ArrayList<String> result = new ArrayList<String> ();
for (String e : tokens) {
    result.add (e);
}

Collections.sort (result);

for (int i = 0; i < result.size () - 1; ++i) {
    int j = i + 1;
    while (result.get (i).equals (result.get (j))) {
       result.remove (j);
       ++j;
    }
}

int n;tokens new String [n result.size ()];
for (int i = 0; i < n; ++i) {
    tokens [i] = result.get (i);
}

ça devrait marcher.
Messages postés
406
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
29 juin 2009
2
;-) de rien

Bonne soirée
Messages postés
34
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
5 juillet 2007

Merci a vous,
concernant la dernier solution proposée, je ne comprend pas tres bien ce qui est fait... notamment le " for (String s : tokens) "

Pouvez vous m'expliquer davantage? merci
pardonnez moi mais je suis débutant :)

j'avais fait quelque chose de different, que je dois encore débug :
CalcNbElemCol me renvoie la taille remplie du tableau

je parcours les éléments, je les test entre eux et si je trouve une égalité je la supprime et je remonte l'ensemble des éléments d'un rang

for (int i=0; i<CalcNbElemCol(tab8); i++)
         {
             for (int j=i+1;j<CalcNbElemCol(tab8); j++)
                {                              
                 if(tab8[i].equals(tab8[j]))
                 { 
                     tab8[j]="";
                     for (int k=j; k<CalcNbElemCol(tab8); k++)
                     {
                      tab8[k]=tab8[k+1];                
                     }
                 }
             }            
         }

Qu'en pensez vous? merci
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

Ceci est parmi les innovation de la version 5 de Java.


for (String s : tokens)
    al.add (s);

Celle ci peur être réécrite ainsi:
for (int i = 0; i < tokens.length; ++i)
    al.add (tokens [i]);

Concernant ta solution, même si tu fais tu décalage tu ne peux pas modifier la taille du tableau.

Petite amélioration:

1. supprimer les doublons en les remplacer par ""
2. recréer le tableau avec les nouveaux éléments différents de  ""
Messages postés
406
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
29 juin 2009
2
je ne vois pas pourquoi vous vous entété à passer par un tableau . On est en java non? donc utilisons les objets existants : ainsi pour notre problème c'est un HashSet, je sais je suis un peu rébarbative mais puisque la technique existe et très simple à mettre en oeuvre pourquoi se compliquer la vie ... sinon on retourne faire du C

à +

lafolle
Messages postés
34
Date d'inscription
jeudi 19 avril 2007
Statut
Membre
Dernière intervention
5 juillet 2007

c'est bon ca marche, merci à vous
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
34
Salut:

De rien, vaut mieux aussi accepter la réponse de LaFolle elle a contribuée à la résolution du problème.