Если ваш List
является изменяемым, вы можете напрямую удалить все элементы, кроме их второго вхождения:
// example list
List<String> example = new ArrayList<>();
Collections.addAll(example, "foo", "bar", "baz", "bar", "bar", "baz");
// actual operation
Map<String,Integer> temp = new HashMap<>();
example.removeIf(s -> temp.merge(s, 1, Integer::sum)!=2);
// example output
example.forEach(System.out::println);// prints bar baz
Приведенное выше решение сохраняет только одну копию для каждой строки, имеющей несколько вхождений, при удалении всех строк, не имеющихдубликаты.Если вы хотите сохранить все дубликаты и просто удалить те строки, которые не имеют дубликатов, сначала невозможно определить статус дубликата.
// same example input as above
// actual operation
Map<String,Boolean> temp = new HashMap<>();
example.forEach(s -> temp.merge(s, true, (a,b) -> false));
example.removeIf(temp::get);
// example output
example.forEach(System.out::println);// prints bar baz bar bar baz
Здесь временная карта может быть создана с помощью операции Stream ста же логика:
Map<String,Boolean> temp = example.stream()
.collect(Collectors.toMap(Function.identity(), s -> true, (a,b) -> false));
example.removeIf(temp::get);