69 votes

le maintien de TreeSet sorte que les modifications de l'objet de valeur

J'ai un objet qui définit un "naturel de l'ordre de tri" à l'aide de Comparable<>. Ceux-ci sont stockés dans TreeSets.

Autres que de supprimer et re-ajout de l'objet, est-il une autre façon de mettre à jour la sorte, lorsque les membres qui sont utilisés pour définir l'ordre de tri sont mis à jour?

14voto

tucuxi Points 5130

Comme d'autres l'ont noté, il n'est pas intégré. Mais vous pouvez toujours sous-classe TreeSet, avec votre constructeur(s) de leur choix, et d'ajouter la fonctionnalité requise:

public class UpdateableTreeSet<T extends Updateable> extends TreeSet<T> {

    // definition of updateable
    interface Updateable{ void update(Object value); }

    // constructors here
    ...

    // 'update' method; returns false if removal fails or duplicate after update
    public boolean update(T e, Object value) {
       if (remove(e)) {
           e.update(value);
           return add(e);
       } else { 
           return false;
       }
    }
}

À partir de là, vous aurez à composer ((UpdateableTreeSet)mySet).update(anElement, aValue) de mettre à jour le tri de la valeur et le tri lui-même. Cela ne vous oblige à mettre en œuvre un supplémentaire update() méthode dans votre objet de données.

5voto

kriegaex Points 6365

J'ai eu un problème similaire, trouvé ce fil et tucuxi réponse (merci!) sur la base de laquelle j'ai mis en place mon propre UpdateableTreeSet. Ma version fournit des moyens d'

  • itérer sur un tel jeu,
  • annexe (différé) de l'élément de mises à jour/absorptions de l'intérieur de la boucle
  • sans avoir à créer une copie temporaire de l'ensemble et, enfin,
  • faire toutes les mises à jour/absorptions comme une opération en bloc après la boucle est terminée.

UpdateableTreeSet cache beaucoup de la complexité de l'utilisateur. En plus de différé en vrac mises à jour/absorptions, de l'élément unique de mise à jour/suppression comme indiqué par tucuxi reste disponible dans la classe.

Mise à jour 2012-08-07: La classe est disponible dans un peu de GitHub , y compris un cours d'introduction à README avec schématique un exemple de code ainsi que les tests unitaires montrant comment (ne pas) utiliser cela plus en détail.

3voto

skaffman Points 197885

Si vous avez vraiment besoin d'utiliser un Set, alors vous êtes hors de la chance, je pense.

Je vais jeter un caractère générique, - si votre situation est assez souple pour travailler avec un List au lieu de Set, alors vous pouvez utiliser Collections.sort() re-trier l' List sur demande. Ce doit être performante, si l' List commande n'a pas à être changé.

1voto

Kevin Bourrillion Points 19677

Il permet de savoir si vos objets seront modifiées par petits incréments ou grand. Si chaque modification est très petite, vous feriez très bien à mettre vos données dans une Liste que vous pouvez garder triés. Pour ce faire, vous devez

  1. binarySearch pour trouver l'indice de l'élément
  2. modifier l'élément
  3. tandis que l'élément est plus grand que son voisin de droite, il échange avec son voisin de droite
  4. ou si cela n'est pas arrivé: alors que l'élément est inférieur à son voisin de gauche, il échange avec son voisin de gauche.

Mais vous devez vous assurer que personne ne peut changer l'élément sans passer par "vous".

EDIT: Aussi! Vitrage Listes bénéficie d'un certain appui pour cela il suffit de:

http://publicobject.com/glazedlists/glazedlists-1.5.0/api/ca/odell/glazedlists/ObservableElementList.html

0voto

Robby Pond Points 37875

Seulement construite en est de retirer et ajouter de nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X