traduccion spanish google fruta examples español java guava

java - spanish - guava traduccion



¿Cuál es una manera eficiente y elegante de agregar un solo elemento a un conjunto inmutable? (6)

Tengo un conjunto inmutable (emitido como un Set<Integer> ) que potencialmente contiene muchos elementos. Necesito una colección que contenga los elementos de ese conjunto más un elemento adicional. Tengo un código de kludgy para copiar el conjunto, luego agregar el elemento, pero estoy buscando el camino correcto que mantenga las cosas lo más eficientes posible.

Tengo guayaba disponible, aunque no requiero su uso.


Cuando desea un mejor rendimiento que una copia completa, y tiene un ordenamiento sobre elementos, puede utilizar un envoltorio inmutable alrededor de un árbol B + para obtener un buen rendimiento de conjunto incremental.

Agregar un elemento a un árbol B + requiere O (registro (n)) tiempo y asignación incremental, no O (n) como se obtiene con ImmutableSet.builder().addAll(...).add(...).build() . Esto significa que la construcción de un conjunto a partir de n adiciones incrementales es O (n * log (n)), no O (sqr (n)).

Esta answer tiene un puntero a una biblioteca jdbm, por lo que podría valer la pena ver jdbm:jdbm .


Estoy experimentando disonancia cognitiva cuando leo "inmutable" y "agregar a" en la misma oración. Puede agregar un nuevo elemento al final de una copia mutable de los valores inmutables, pero no puede modificar el conjunto inmutable. No sé de nada elegante.


No estoy seguro acerca del rendimiento, pero puedes usar ImmutableSet.Builder de Guava:

import com.google.common.collect.ImmutableSet // ... Set<Integer> newSet = new ImmutableSet.Builder<Integer>() .addAll(oldSet) .add(3) .build();

Por supuesto, también puedes escribirte un método de ayuda para eso:

public static <T> Set<T> setWith(Set<T> old, T item) { return new ImmutableSet.Builder<T>().addAll(old).add(item).build(); } // ... Set<Integer> newSet = setWith(oldSet, 3);


Si el Conjunto es inmutable, no veo otra forma de hacerlo que no sea copiar el Conjunto y luego agregar su nuevo elemento. Recuerde, copiar un conjunto es tan fácil como pasar el conjunto base a la función de constructor al crear el nuevo conjunto.


Tienes tres opciones.

  • Utilice un conjunto mutable.
  • Verifique que el elemento no esté presente, si no cree una copia del conjunto y agregue un elemento.
  • Cree un conjunto de contenedor que incluya el conjunto anterior y el elemento.

A veces, un BitSet es una mejor opción que Set<Integer> dependiendo de la distribución de sus valores.


Usted podría considerar Sets.union (). La construcción sería más rápida, pero más lenta de usar.

public static <T> Set<T> setWith(Set<T> old, T item) { return Sets.union(old, Collections.singleton(item); }

(com.google.common.collect.Sets & java.util.Collections)