Pregunta

I tiene un SortedSet (específicamente un TreeSet) que contiene actualizaciones. Una actualización es algo así como un SVN, el muro de facebook, nuevo ticket Trac, etc. Estoy almacenando estos en un SortedSet porque:

  • Ordenada:. Los cambios deben ser ordenados por fecha, descendiendo
  • Set:. Cuando ir a buscar las últimas actualizaciones de una fuente de actualización, que por lo general recibirá actualizaciones que ya están en el conjunto

Ahora, después de un tiempo el conjunto crecerá realmente enorme, así que me gustaría para eliminar todo menos los primeros elementos del conjunto X (porque los demás no se mostrarán todos modos). ¿Cómo puedo hacer esto, ya que no es un List?

¿Fue útil?

Solución

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

Otros consejos

La solución a este problema debe depender del hecho de si necesita los datos "extra" en el futuro. Si necesita que su solución basada en la lista adicional está bien. Si no es así, me gustaría sugerir lo siguiente:

Cree su propio conjunto ordenado que se extiende la java.util.SortedSet y anula su método add (). Este método no debe hacer nada después de cierto límite. Como alternativa, puede crear "envoltorio" Set conjunto que mantiene la carga útil y delegados todos los métodos, excepto add (). El método add () debe delegar su llamada sólo si el tamaño del conjunto de carga útil es menor que el límite predefinido. Esta es la forma FixedSizeSortedMap de obras marco de recopilación de Jakarta, por lo que sólo puede utilizar a él.

La respuesta aceptada en no realmente eficiente O (ln n) , ya que utiliza la función de eliminación. Aquí es una mejor desde pollLast() es O (1) y el tamaño es O (1) . Complejidad sólo será afectada por el tamaño recortado.

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

Mi propia solución es:

        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);

Aquí está un método de solución de trabajo para Java, dado un TreeSet resultados , y una variable Tamaño que especifica el tamaño del conjunto resultante:

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
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top