Supprimer les doublons dans un tableau [Résolu]

soyonsami 34 Messages postés jeudi 19 avril 2007Date d'inscription 5 juillet 2007 Dernière intervention - 23 mai 2007 à 14:49 - Dernière réponse : Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention
- 25 mai 2007 à 14:50
   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
Afficher la suite 

14 réponses

Répondre au sujet
lafolle24320 406 Messages postés samedi 26 mars 2005Date d'inscription 29 juin 2009 Dernière intervention - 23 mai 2007 à 16:45
+1
Utile
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 ?
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de lafolle24320
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 23 mai 2007 à 17:09
+1
Utile
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 % ...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Ombitious_Developper
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 24 mai 2007 à 15:02
+1
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Ombitious_Developper
soyonsami 34 Messages postés jeudi 19 avril 2007Date d'inscription 5 juillet 2007 Dernière intervention - 23 mai 2007 à 15:10
0
Utile
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
Commenter la réponse de soyonsami
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 23 mai 2007 à 15:15
0
Utile
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
Commenter la réponse de Ombitious_Developper
lafolle24320 406 Messages postés samedi 26 mars 2005Date d'inscription 29 juin 2009 Dernière intervention - 23 mai 2007 à 16:04
0
Utile
Et pourquoi ne pas passer par un HashSet ??? tableau qui ne comtient pas de doublon?

lafolle
Commenter la réponse de lafolle24320
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 23 mai 2007 à 16:24
0
Utile
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);
}
Commenter la réponse de Ombitious_Developper
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 23 mai 2007 à 16:35
0
Utile
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.
Commenter la réponse de Ombitious_Developper
lafolle24320 406 Messages postés samedi 26 mars 2005Date d'inscription 29 juin 2009 Dernière intervention - 23 mai 2007 à 18:01
0
Utile
;-) de rien

Bonne soirée
Commenter la réponse de lafolle24320
soyonsami 34 Messages postés jeudi 19 avril 2007Date d'inscription 5 juillet 2007 Dernière intervention - 24 mai 2007 à 08:27
0
Utile
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
Commenter la réponse de soyonsami
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 24 mai 2007 à 14:38
0
Utile
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  ""
Commenter la réponse de Ombitious_Developper
lafolle24320 406 Messages postés samedi 26 mars 2005Date d'inscription 29 juin 2009 Dernière intervention - 24 mai 2007 à 14:46
0
Utile
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
Commenter la réponse de lafolle24320
soyonsami 34 Messages postés jeudi 19 avril 2007Date d'inscription 5 juillet 2007 Dernière intervention - 25 mai 2007 à 11:29
0
Utile
c'est bon ca marche, merci à vous
Commenter la réponse de soyonsami
Ombitious_Developper 2333 Messages postés samedi 28 février 2004Date d'inscription 26 juillet 2013 Dernière intervention - 25 mai 2007 à 14:50
0
Utile
Salut:

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

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.