Supprimer les doublons dans un tableau [Résolu]

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

Votre réponse

14 réponses

Meilleure réponse
Messages postés
406
Date d'inscription
samedi 26 mars 2005
Dernière intervention
29 juin 2009
- 23 mai 2007 à 16:45
1
Merci
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 ?

Merci lafolle24320 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de lafolle24320
Meilleure réponse
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
- 23 mai 2007 à 17:09
1
Merci
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 % ...

Merci Ombitious_Developper 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Ombitious_Developper
Meilleure réponse
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
- 24 mai 2007 à 15:02
1
Merci
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.

Merci Ombitious_Developper 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de Ombitious_Developper
Messages postés
34
Date d'inscription
jeudi 19 avril 2007
Dernière intervention
5 juillet 2007
- 23 mai 2007 à 15:10
0
Merci
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
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
- 23 mai 2007 à 15:15
0
Merci
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
Messages postés
406
Date d'inscription
samedi 26 mars 2005
Dernière intervention
29 juin 2009
- 23 mai 2007 à 16:04
0
Merci
Et pourquoi ne pas passer par un HashSet ??? tableau qui ne comtient pas de doublon?

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

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