La répetition des elements d'un tableau java
Fermé
sabrine
-
9 nov. 2008 à 18:08
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 - 11 nov. 2008 à 14:35
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 - 11 nov. 2008 à 14:35
A voir également:
- Supprimer un element d'un tableau en java
- Supprimer compte instagram - Guide
- Supprimer une page word - Guide
- Tableau croisé dynamique - Guide
- Supprimer compte facebook - Guide
- Supprimer un compte gmail - Guide
1 réponse
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
326
9 nov. 2008 à 20:40
9 nov. 2008 à 20:40
Bonjour Sabrine,
En fait, c'est assez maladroit d'utiliser un tableau en java pour effectuer ce genre de traitement.
Je m'explique. Globalement tu vas créer un tableau de taille donnée, insérer des éléments à tout va, puis lorsque tu vas vouloir supprimer des éléments, tu vas avoir des tableaux avec des trous (et donc de la mémoire perdue).
De plus, pour supprimer les doublons, tu dois :
- créer une hashmap
- parcourir ton tableau (complexité O(n))
- tester si l'élément courant est dans la hashmap : si oui, tu le supprimes, sinon tu le stockes dans la hashmap et tu passes à l'élément suivant
Pour conclure, tu parcours ton tableau O(n), mais en plus tu es obligée de créer une map pour vérifier que chaque valeur n'existe pas (O(n) aussi).
L'idéal selon moi, c'est d'utiliser directement une map, comme cela tu n'auras jamais de problème de doublon et tu optimises tout cela (plus besoin de parcours, plus besoin de vérification).
Cordialement,
En fait, c'est assez maladroit d'utiliser un tableau en java pour effectuer ce genre de traitement.
Je m'explique. Globalement tu vas créer un tableau de taille donnée, insérer des éléments à tout va, puis lorsque tu vas vouloir supprimer des éléments, tu vas avoir des tableaux avec des trous (et donc de la mémoire perdue).
De plus, pour supprimer les doublons, tu dois :
- créer une hashmap
- parcourir ton tableau (complexité O(n))
- tester si l'élément courant est dans la hashmap : si oui, tu le supprimes, sinon tu le stockes dans la hashmap et tu passes à l'élément suivant
Pour conclure, tu parcours ton tableau O(n), mais en plus tu es obligée de créer une map pour vérifier que chaque valeur n'existe pas (O(n) aussi).
L'idéal selon moi, c'est d'utiliser directement une map, comme cela tu n'auras jamais de problème de doublon et tu optimises tout cela (plus besoin de parcours, plus besoin de vérification).
Cordialement,
10 nov. 2008 à 22:41
11 nov. 2008 à 01:05
Une petite question avant toute chose. Ton tableau a une taille fixe. Autrement dit, quand on va supprimer des éléments, et donc la valeur contenue dans "la case" du tableau sera nulle.
Ma question est donc :
"Est ce que ça te dérange d'avoir un tableau avec plein de valeurs nulles dedans, ou est-ce que tu veux diminuer la taille de ton tableau à chaque suppression afin d'avoir un tableau qui soit toujours plein ?"
Cordialement,
11 nov. 2008 à 10:58
et merci d'avance.
11 nov. 2008 à 14:35
Essaie le code suivant:
public static Object[] enleveDoublons(Object[] table) { //Complexity = O(n²) Object[] copy = new Object[table.length]; System.arraycopy(table, 0, copy, 0, table.length); table = copy; for (int i = 0; i < table.length; i++) { for (int j = i + 1; j < table.length; j++) { //Si table[j] n'est jamais null, simplifier la ligne suivante if (table[j] != null && table[j].equals(table[i])) { table[j] = table[table.length - 1]; table[table.length - 1] = null; Object[] newTable = new Object[table.length - 1]; System.arraycopy(table, 0, newTable, 0, table.length - 1); table = newTable; j--; } } } return table; }Tu peux l'utiliser pour copier n'importe quel tableau d'objet, moyennant un cast avant :
Integer[] entree = new Integer[15];
Object[] sortie = enleveDoublons((Object[]) entree);
Ou peut-être plus simple :
Object[] entree = new Integer[15];
Object[] sortie = enleveDoublons(entree);
Par contre ça ne fonctionne pas avec les tableaux de types primitifs (j'utilise des Object[] pour que ce soit générique, et les types primitifs ne sont pas des instances de Object).
Cordialement,