Question

J'ai un SortedSet (en particulier un TreeSet) contenant des mises à jour. Une mise à jour est quelque chose comme un commit SVN, après mur Facebook, nouveau ticket de Trac, etc. Je suis emmagasiner dans un SortedSet parce que:

  • Ordre. Les mises à jour doivent être triés par date, descendant
  • Set. Lors de l'extraction des dernières mises à jour à partir d'une source de mise à jour, je vais recevoir habituellement les mises à jour qui sont déjà dans l'ensemble

Maintenant, après un certain temps l'ensemble se développera vraiment énorme, donc je voudrais enlever quoi que ce soit, mais les premiers éléments X de l'ensemble (parce que d'autres ne seront pas affichés de toute façon). Comment puis-je faire cela, car ce n'est pas List?

Était-ce utile?

La solution

While(mySet.size() > limit) {
  mySet.remove(mySet.last());
}

Autres conseils

La solution ici devrait dépendre du fait de savoir si vous avez besoin des données « supplémentaires » à l'avenir. Si vous avez besoin de votre solution sur la liste supplémentaire est ok. Sinon, je vous suggère ce qui suit:

Créez votre propre jeu Sorted qui étend la java.util.SortedSet et remplace sa méthode add (). Cette méthode ne devrait rien faire après une certaine limite. Sinon, vous pouvez créer « wrapper » Set qui tient ensemble de la charge utile et les délégués de toutes les méthodes sauf add (). La méthode add () doit déléguer son appel que si la taille du jeu de la charge utile est inférieure à la limite prédéfinie. Ceci est comment FixedSizeSortedMap des oeuvres cadre de collecte de jakarta, de sorte que vous pouvez simplement utiliser il.

La réponse acceptée à ne pas vraiment efficace O (ln n) parce qu'il utilise la fonction supprimer. Voici un meilleur depuis pollLast() est O (1) et la taille est O (1) . La complexité ne sera affectée par la taille parés.

While(mySet.size() > limit) {
  mySet.pollLast();
}

Mon propre solution de contournement est:

        List<Update> trimmed = new ArrayList<Update>(20);
        int i = 0;
        for (Update u : updates) {
            trimmed.add(u);
            i++;
            if (i > 20) break;
        }
        updates = new TreeSet<Update>(trimmed);

Voici une méthode de solution de travail pour Java, étant donné un TreeSet Résultats , et une variable Taille en spécifiant la taille de l'ensemble résultant:

void setLimit(Set<T> resutls, int size) {
    List<T> items = new ArrayList<T>();
    items.addAll(resutls);
    resutls.clear();
    int trim = size>items.size() ? items.size() : size;
    resutls.addAll(items.subList(0,trim));
    // return results; // optionally, if required
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top