without values repeated remove from duplicate delete check java list duplicates unique

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]