Enlever toutes les occurrences du même élément d'une ArrayList

Résolu/Fermé
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 - 5 févr. 2016 à 19:41
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 - 6 févr. 2016 à 20:11
Salut,

J'ai une list qui peut contenir des éléments des différents types.


ArrayList list = new ArrayList();
list.add(1);
list.add("1");
list.add(1.4);
list.add("1.4");
list.add("hy");
list.add("hy");


Je veux supprimer toutes les occurrences des éléments dupliqués.

Donc la valeur "1" est la même que 1, donc tous les deux vont être supprimés.

la même chose pour "1.4" et 1.4 et "hy"

Donc à la fin je dois avoir une list vide.

Le problème revient à vérifier les valeur de chaque élément de la liste quel que soit le type de l'élément.

Est-ce-qu'il y a qu'il y a quelqu'un qui peut m'aider SVP.

Merci

2 réponses

KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
6 févr. 2016 à 11:56
Bonjour,

En Java les données sont typées. Et dans ta liste même si les valeurs s'affichent de la même manière en réalité elles sont de types différents.

Tu peux afficher les types de données comme ceci :
for (Object obj : list)
    System.out.println(obj.getClass().getSimpleName()+" "+obj);

Ce qui donne :
Integer 1
String 1
Double 1.4
String 1.4
String hy
String hy
En conséquence 1 et "1" sont différents puisque leurs types sont différents, de même pour 1.4 et "1.4".

Éventuellement dans ton cas tu peux considérer que deux objets ont la même valeur si la méthode toString() renvoie la même chose. C'est à dire que les deux objets s'affichent de la même manière.

Dans ce cas je te conseilles de faire une Map avec les valeurs toString en clé et le nombre d’occurrences en valeur puis ensuite de ne garder que les objets dont le toString n'a que des valeurs 1.

ArrayList<Object> list = new ArrayList<>();
list.add(1);
list.add("1");
list.add(1.4);
list.add("1.4");
list.add("hy");
list.add("hy");

System.out.println(list); // [1, 1, 1.4, 1.4, hy, hy]

Map<String, Integer> tmp = new HashMap<String, Integer>();

for (Object obj : list) {
    String str = obj.toString();
    Integer n = tmp.get(str);
    tmp.put(str, n == null ? 1 : n + 1);
}

System.out.println(tmp); // {1=2, hy=2, 1.4=2}

List<Object> result = new ArrayList<>();

for (Object obj : list) {
    String str = obj.toString();
    Integer n = tmp.get(str);
    if (n == 1)
        result.add(obj);
}

System.out.println(result); // []
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
6 févr. 2016 à 16:17
Merci KX,

En fait, j'ai pensé exactement à utiliser le toString(), parce-que ça renvoie la même valeur pour "1" et 1, mais je n'ai pas eu l'idée d'utiliser les Map.

En si vous me permettez, je veux demander un conseil.
Je veux une list pareils, car je travail sur le DataMining dans le big Data.

du coup à partir d'un fichier qui contient des lignes structurées, comme : Exemple table de température moyenne pour chaque mois
Jan Fev Mars ........
Paris 1 2 5 ......
Autre_ville -1 3 10 ....

C'est juste un exemple de données(DataSet).

Du coup je dois concevoir une class DataSet par exemple en java pour pouvoir stocker les lignes pour traiter les lignes ou les colonnes aussi quel que soit le type des données.

J'ai essayé de chercher des Modèles UML pour modéliser la structure des données, mais je n'ai pas encore trouvé. du coup j'ai essayé de coder cette class qui peut me présenter des DataSet. parfois on les appelle Vector ou (Attribute, Instance, Instances ..).

SVP, est-ce-que vous avez des conseils pour modéliser des structures de données de types différentsen UML ou java?

Merci bien KX.
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
6 févr. 2016 à 16:19
Voilà un petit bout de code que j'ai commencé à écrire

package com.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Vector<E> implements Serializable, Comparable<Vector<E>> {

private static final long serialVersionUID = 782238935008145145L;

private ArrayList<E> vector = new ArrayList<>();

private int size;

public Vector() {
this.vector = new ArrayList<>();
}

@SuppressWarnings("unchecked")
public Vector(E e) {
this.vector = (ArrayList<E>) e;
}

@SuppressWarnings("unchecked")
public Vector<E> clone() {
return new Vector<E>((E) this.vector.clone());
}

public ArrayList<E> getElements() {
return this.vector;
}


public void addVector(ArrayList<E> newVector) {
this.vector.addAll(newVector);
}


public int getSize() {
return vector.size();
}

public void setSize(int size) {
this.size = size;
}

public String[] getType() {

String[] typeOutputs = new String[vector.size()];
int typeOutputsPosition = 0;
for (Iterator<E> it = vector.iterator(); it.hasNext();) {

Object obj = (E) it.next();
char[] objCharArray = obj.toString().toCharArray();
int numberCounter = 0;
for (int i = 0; i < objCharArray.length; i++) {
if (Character.isLetter(objCharArray[i])) {
// this elements is String
typeOutputs[typeOutputsPosition] = "String";
} else if (Character.isDigit(objCharArray[i])) {
numberCounter++;
} else if (objCharArray[i] == '.') {
numberCounter++;
}

if ((numberCounter == objCharArray.length) || (numberCounter == objCharArray.length - 1)) {
typeOutputs[typeOutputsPosition] = "numeric";
}
}

typeOutputsPosition++;
}
return typeOutputs;
}

public String getType(int atPosition) {

String typeOutput = new String();

char[] objCharArray = vector.get(atPosition).toString().toCharArray();
int numberCounter = 0;

for (int i = 0; i < objCharArray.length; i++) {
if (Character.isLetter(objCharArray[i])) {
typeOutput = "String";

} else if (Character.isDigit(objCharArray[i])) {
numberCounter++;
} else if (objCharArray[i] == '.') {
numberCounter++;
}

if ((numberCounter == objCharArray.length) || (numberCounter == objCharArray.length - 1)) {
typeOutput = "numeric";
}
}

return typeOutput;
}

@Override
public int compareTo(Vector<E> o) {
int result = 1;
if ((vector.size() == 0) && (o.size == 0)) {
result = 0;
return result;
}
for (int i = 0; i < vector.size(); i++) {
if (vector.get(i).equals(o.getElements().get(i))) {
result = 0;

} else {
result = 1;
}
}
return result;
}

public void add(E element) {
this.vector.add(element);
}

public void addAtPosition(int position, E element) {
this.vector.add(position, element);
}

public void remove(E element){
this.vector.remove(element);
}

public void removeAtPosition(int position){
this.vector.remove(position);
}

public void removeAllElement(E element){
//TODO
//C'est ici où je dois implémenter le code que vous m'avez écrit
}
public String toString(){
StringBuilder sb= new StringBuilder();
for(int i=0; i< vector.size(); i++){
sb.append(vector.get(i));
if(i< vector.size()-1){
sb.append(",");
}

}
return sb.toString();
}

}

0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
6 févr. 2016 à 17:36
En fait j'ai écrit ce code qui me permet d'enlever toutes les occurences d'un éléments spécifiques d'une lis, et ça marche:

public void removeAllElement(E element){

ArrayList<E> list = new ArrayList<>();
for(Object obj : vector){
if(obj.toString().equals(element.toString())){
continue;
}else{
list.add((E)obj);
}
}

vector = list;
}
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
Modifié par KX le 6/02/2016 à 18:00
Je me suis un peu perdu avec tes derniers messages, tu as encore des questions ?

Remarque : si tu travailles avec un type E alors utilises le plutôt que d'avoir un Object, ça t'éviteras d'avoir à faire des cast, comme dans ton dernier code.

De plus pour éviter les NullPointerException tu devrais utiliser String.valueOf(obj) au lieu de faire un obj.toString()

Enfin la structure
if (...) { continue; } else { ... }
est maladroite, il y a plus simple.

ArrayList<E> list = new ArrayList<>();
for (E obj : vector) { // ArrayList<E> vector
    if (!String.valueOf(obj).equals(String.valueOf(element))) {
        list.add(obj); // plus besoin de caster obj en E
    }
}
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
6 févr. 2016 à 18:33
Je reformule ma question,
Je travail sur un projet d'analyse des données, je ne sais pas encore comment seront les données(structure : lignes et colonnes).

du coup j'ai pensé s'il y a un modèle de class java qui peut représenter un DataSet général, qui peut traiter des données quelques soient leurs types(String, Integer, Double, Date)

Il y a des implémentation des Vector ou DataSet , Attribute, Instance en java, mais je veux créer ma propre solution.

Du coup pour faire du Data Modeling est-ce-qu'il y a des règles à suivre, Car après la phase de la collecte des données et le stockage des données(Hadoop), je vais m'orienter vers Hadoop pour pouvoir faire des traitements parallels sur des plusieurs clusters.

Ma question est comment concevoir une classe, qui traiter des données différents, est-ce-que le modèle de la classe que j'ai écrit la dessus suit le bon chemin où il y a quelques choses à ajouter en considération?

J’espère avoir des conseils de votre part.
Merci KX
0
neocol Messages postés 63 Date d'inscription mardi 4 juin 2013 Statut Membre Dernière intervention 6 février 2016 1
6 févr. 2016 à 18:40
Merci pour ton code ça marche nickel.
0