El código es difícil de leer y no es muy eficiente. El parámetro "dest" es confuso: se pasa como un parámetro, luego se borra y los resultados se agregan a él. ¿Cuál es el punto de que sea un parámetro? ¿Por qué no simplemente devuelve una nueva colección? El único beneficio que puedo ver es que la persona que llama puede determinar el tipo de colección. ¿Es eso necesario?
creo que este código puede ser más clara y probablemente más eficiente escrita de la siguiente manera:
public static Set<String> createSet(Collection<String> source) {
Set<String> destination = new HashSet<String>(source) {
private static final long serialVersionUID = 1L;
public boolean add(String o) {
if ("".equals(o)) {
return false;
}
return super.add(o);
}
};
return destination;
}
Otra forma es crear su propio tipo de conjunto:
public class NonEmptyStringSet extends HashSet<String> {
private static final long serialVersionUID = 1L;
public NonEmptyStringSet() {
super();
}
public NonEmptyStringSet(Collection<String> source) {
super(source);
}
public boolean add(String o) {
if ("".equals(o)) {
return false;
}
return super.add(o);
}
}
Uso:
createSet(source);
new NonEmptyStringSet(source);
Devolver el conjunto es más eficaz ya que primero no tiene que crear un conjunto temporal y luego un anuncio d todo a la colección dest.
El beneficio del tipo NonEmptyStringSet es que puede seguir agregando cadenas y aún tener la verificación de cadena vacía.
EDIT1:
Extracción del "si (src.containsAll (dest)) return;" código introduce un "error" al llamar al método con fuente == dest; El resultado es que la fuente estará vacía Ejemplo:.
Collection<String> source = new ArrayList<String>();
source.add("abc");
copyStringCollectionAndRemoveDuplicates(source, source);
System.out.println(source);
Edit2:
Hice un pequeño benchmark que muestra que mi implementación es aproximadamente un 30% más rápida que una versión simplificada de su implementación inicial. Este benchmark es un caso óptimo para su implementación inicial porque la colección de destino está vacía, por lo que no tiene que borrarla También tenga en cuenta que mi implementación utiliza HashSet en lugar de LinkedHashSet, lo que hace que mi implementación sea un poco más rápida.
código
Benchmark:
public class SimpleBenchmark {
public static void main(String[] args) {
Collection<String> source = Arrays.asList("abc", "def", "", "def", "",
"jsfldsjdlf", "jlkdsf", "dsfjljka", "sdfa", "abc", "dsljkf", "dsjfl",
"js52fldsjdlf", "jladsf", "dsfjdfgljka", "sdf123a", "adfgbc", "dslj452kf", "dsjfafl",
"js21ldsjdlf", "jlkdsvbxf", "dsfjljk342a", "sdfdsa", "abxc", "dsljkfsf", "dsjflasd4");
int runCount = 1000000;
long start1 = System.currentTimeMillis();
for (int i = 0; i < runCount; i++) {
copyStringCollectionAndRemoveDuplicates(source, new ArrayList<String>());
}
long time1 = (System.currentTimeMillis() - start1);
System.out.println("Time 1: " + time1);
long start2 = System.currentTimeMillis();
for (int i = 0; i < runCount; i++) {
new NonEmptyStringSet(source);
}
long time2 = (System.currentTimeMillis() - start2);
System.out.println("Time 2: " + time2);
long difference = time1 - time2;
double percentage = (double)time2/(double) time1;
System.out.println("Difference: " + difference + " percentage: " + percentage);
}
public static class NonEmptyStringSet extends HashSet<String> {
private static final long serialVersionUID = 1L;
public NonEmptyStringSet() {
}
public NonEmptyStringSet(Collection<String> source) {
super(source);
}
@Override
public boolean add(String o) {
if ("".equals(o)) {
return false;
}
return super.add(o);
}
}
public static void copyStringCollectionAndRemoveDuplicates(
Collection<String> src, Collection<String> dest) {
Set<String> uniqueSet = new LinkedHashSet<String>(src.size());
for (String f : src)
if (!"".equals(f))
uniqueSet.add(f);
dest.addAll(uniqueSet);
}
}
Solo un pequeño comentario, no relacionado con su pregunta: target y des tienen significados similares. Dado que está copiando una cadena no vacía de un destino a otro, ¿puede cambiarle el nombre a src? –