Tengo un ArrayList que contiene algunas cadenas:
ArrayList<String> strList = new ArrayList<String>();
strList.addAll(Arrays.asList("interface", "list", "Primitive", "class", "primitive", "List", "Interface", "lIst", "Primitive"));
He escrito un método para quitar el caso insensible cuerdas de la ArrayList:
public static ArrayList<String> removeDuplicates(ArrayList<String> strList) {
for(int i = 0; i < strList.size(); i++) {
for(int j = i + 1; j < strList.size(); j++) {
if(strList.get(i).equalsIgnoreCase(strList.get(j))){
strList.remove(j);
j--;
}
}
}
return strList;
}
ouput:
[interface, list, Primitive, class]
Sin embargo, estoy tratando de eliminar sólo la primera aparición de las cuerdas. Estoy tratando de hacer lo que mi salida sería igual a:
[Interface, lIst, Primitive, class]
¿Cuáles serían las últimas ocurrencias de los duplicados en el ArrayList
Lo que estoy tratando de hacer en concreto:
La versión de la cadena que permanece es la misma que la última ocurrencia. En otras palabras, la versión de los últimos estancias de ocurrencia en el lugar de la primera aparición
Creo que eliminan de la ArrayList
que no es buena idea. Es mejor está utilizando Map
para crear nueva lista:
public static List<String> removeDuplicates(List<String> strList) {
Map<String, String> map = new LinkedHashMap<>();
strList.forEach(item -> map.put(item.toLowerCase(), item));
return new ArrayList<>(map.values());
}
Entrada: [interface, list, Primitive, class, primitive, List, Interface, lIst, Primitive]
Salida: [Interface, lIst, Primitive, class]
PD
Lo mismo con una sola línea Stream
, pero un poco no está tan claro:
public static List<String> removeDuplicates(List<String> strList) {
return new ArrayList<>(strList.stream().collect(Collectors.toMap(String::toLowerCase, str -> str, (prev, next) -> next, LinkedHashMap::new)).values());
}