Add pour treeset

Résolu
hasnaa-1 Messages postés 11 Statut Membre -  
hasnaa-1 Messages postés 11 Statut Membre -
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

  1. KX Messages postés 19031 Statut Modérateur 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
    1. hasnaa-1 Messages postés 11 Statut Membre
       
      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
    2. KX Messages postés 19031 Statut Modérateur 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
    3. hasnaa-1 Messages postés 11 Statut Membre
       
      merci
      mais je veux qu il remplace la derniere valeur ajouter par l ancienne
      0
    4. KX Messages postés 19031 Statut Modérateur 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
    5. hasnaa-1 Messages postés 11 Statut Membre
       
      muchas gracias
      0