Add pour treeset

Résolu
hasnaa-1 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
hasnaa-1 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour a tous

lorsqu'on utilise add pour un treeset et on a deux éléments qui sont considérés égaux alors qu il est l élément qui va être supprime est ce que ca sera l ancien au bien le nouveau élément ajoute


merci d'avance pour vos réponses

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Question intéressante, la réponse est dans la documentation :

https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html#add(E)

"Adds the specified element to this set if it is not already present. More formally, adds the specified element e to this set if the set contains no element e2 such that (e==null ? e2==null : e.equals(e2)). If this set already contains the element, the call leaves the set unchanged and returns false."
1
hasnaa-1 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
merci beaucoup pour votre réponse mais est ce qu il n'y a pas une manier pour garder le nouveau élément

par exemple est ce que je ne peux pas dans la méthode compareTo,
dans le cas ou les 2 éléments sont considérés égaux,de garder le dernier élément ajoute ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Effectivement c'est possible, il suffit que le Comparator ne renvoie jamais 0, même en cas d'égalité. Ce n'est plus plus vraiment un arbre dans ce cas, mais ça se fait.

Exemple :

import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetMultiple<E extends Comparable<E>> extends TreeSet<E>
{
    private static final long serialVersionUID = 1;

    public TreeSetMultiple()
    {
        super(new Comparator<E>()
        {
            @Override
            public int compare(E e1, E e2)
            {
                int n = e1.compareTo(e2);
                
                if (n==0)
                    return 1;
                else
                    return n;
            }
        });
    }
}

public class Test
{
    public static void main(String[] args)
    {
        TreeSetMultiple<Integer> tree = new TreeSetMultiple<Integer>();

        tree.add(1);
        tree.add(2);
        tree.add(3);
        tree.add(4);
        tree.add(2);
        tree.add(3);
        
        System.out.println(tree); // [1, 2, 2, 3, 3, 4]
    }
}
0
hasnaa-1 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
merci
mais je veux qu il remplace la derniere valeur ajouter par l ancienne
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Au temps pour moi, j'avais mal compris, mais dans ce cas c'est encore plus simple, pas besoin de Comparator, il suffit de modifier la méthode add pour supprimer d'abord l'élément avant de l'ajouter.

import java.util.TreeSet;

public class TreeSetMultiple<E> extends TreeSet<E>
{
    private static final long serialVersionUID = 1;

    @Override
    public boolean add(E e)
    {
        this.remove(e);        
        return super.add(e);
    }
}

Le plus dur en fait c'est l'exemple, pour être sûr que c'est bien le nouveau qui est ajouté :

public class Test<E extends Comparable<E>> implements Comparable<Test<E>>
{
    private static int n=0;

    private int id = ++n;
    private E e;
    
    public Test(E e)
    {
        this.e = e;
    }
    
    public String toString()
    {
        return String.format("{id=%d, %s}",id,e.toString());
    }
    
    @Override
    public int compareTo(Test<E> t)
    {
        return e.compareTo(t.e);
    }
    
    public static void main(String[] args)
    {
        TreeSetMultiple<Test<Integer>> tree = new TreeSetMultiple<Test<Integer>>();

        tree.add(new Test<Integer>(1));
        System.out.println(tree); // [{id=1, 1}]
        tree.add(new Test<Integer>(2));
        System.out.println(tree); // [{id=1, 1}, {id=2, 2}]
        tree.add(new Test<Integer>(1));
        System.out.println(tree); // [{id=3, 1}, {id=2, 2}]
        tree.add(new Test<Integer>(3));
        System.out.println(tree); // [{id=3, 1}, {id=2, 2}, {id=4, 3}]
        tree.add(new Test<Integer>(2));
        System.out.println(tree); // [{id=3, 1}, {id=5, 2}, {id=4, 3}]
        tree.add(new Test<Integer>(4));
        System.out.println(tree); // [{id=3, 1}, {id=5, 2}, {id=4, 3}, {id=6, 4}]
    }
}
0
hasnaa-1 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
muchas gracias
0