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
Bonjour,


svp je voulais savoir comment supprimer un élément qui se répète un certain nombre de fois.

merci.
A voir également:

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 329
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,
1
Je vs remercie pour cette idée mais je ne voulais pas gérer ce problème avec les collections , je veux une solution sur les tableaux.
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329 > sabrine
11 nov. 2008 à 01:05
Ok, on va faire ça avec un tableau alors.
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,
0
sabrine > 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 à 10:58
oui ,je veux diminuer la taille de mon tableau à chaque suppression afin d'avoir un tableau qui soit toujours plein mais avec des valeurs uniques non répétitives .

et merci d'avance.
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329 > sabrine
11 nov. 2008 à 14:35
Bonjour Sabrine,
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,
0