java - values - Encuentra cadenas duplicadas en la lista y hazlas únicas
remove duplicates java arraylist (3)
Tengo un ArrayList
con valores de cadena duplicados y quiero hacer que los duplicados sean únicos al anexar un conteo.
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("b");
list.add("c");
list.add("a");
list.add("a");
list.add("a");
HashSet<String> set = new HashSet<String>();
List<String> duplicateList = new ArrayList<String>();
for (String item : list) {
// If String is not in set, add it to the list and the set.
if (!set.contains(item)) {
set.add(item);
} else {
duplicateList.add(item);
}
}
for (String element : duplicateList) {
System.out.println(element);
}
}
¿Hay alguna manera de hacer la lista como:
a
b
c
d
b1
c1
a1
a2
a3
Parece que tienes la idea correcta. Solo necesita usar un Map
y contar realmente las cadenas encontradas en lugar de simplemente observar que se encontraron:
Map<String, Integer> counter = new HashMap<>();
List<String> duplicateList = new ArrayList<>();
for (String item : list) {
// If String is not in set, add it to the list and the set, and
// note this is the first time it''s encountered
if (!counter.containsKey(item)) {
duplicateList.add(item);
counter.put(item, 1);
} else {
Integer count = counter.get(item);
duplicateList.add(item + count);
item.put(item, count + 1);
}
}
Puede usar un LinkedHashSet
y puede usar Arrays.asList(T...)
para inicializar su List
. Primero, verifica si el conjunto contiene el elemento de la list
. Si lo hace, itere los valores hasta que encuentre uno que no aparezca. Algo como,
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c", "d",
"b", "c", "a", "a", "a"));
Set<String> mySet = new LinkedHashSet<>();
for (String str : list) {
if (mySet.contains(str)) {
int i = 1;
while (mySet.contains(str + i)) {
i++;
}
str = str + i;
}
mySet.add(str);
}
System.out.println(mySet);
Qué salidas (según lo solicitado)
[a, b, c, d, b1, c1, a1, a2, a3]
Suponiendo que usa Java 8 , si desea obtener la cantidad total de duplicados de cada valor de su List
, puede hacerlo gracias a Stream API
agrupando por valores y contando las ocurrencias de cada valor como sigue:
Map<String, Long> counter = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
System.out.println(counter);
Salida:
{a=4, b=2, c=2, d=1}
Si desea evitar duplicados agregando un contador al final de la String
original, puede usar LinkedHashSet
para preservar el orden de los valores según lo propuesto por Elliott Frisch .
Un enfoque ligeramente diferente al de Elliott Frisch :
List<String> list = Arrays.asList("a", "b", "c", "d", "b", "c", "a", "a", "a");
Set<String> set = new LinkedHashSet<>();
for (String str : list) {
String value = str;
// Iterate as long as you can''t add the value indicating that we have
// already the value in the set
for (int i = 1; !set.add(value); i++) {
value = str + i;
}
}
System.out.println(set);
Salida:
[a, b, c, d, b1, c1, a1, a2, a3]