Есть массив строк, нужно удалить НЕповторяющиеся элементы.
Нашла минималистичный код для удаления повторяющихся элементов:
Set<String> set = new HashSet<String>(Arrays.asList(str));
String[] result = set.toArray(new String[set.size()]);
Но из-за его минималистичности не могу понять, каким образом преобразовать его в то, что нужно мне.
Set set = new HashSet(Arrays.asList(str));
Set - коллекция уникальных элементов, т.е. там нет одинаковых)
String[] result = set.toArray(new String[set.size()]);
тут идет обычное преобразование сета в массив. В итоге result - массив всех элементов без их дубликатов.
Т.е. если было "абв" "а" "абв" "б" "с" "а" то станет "абв" "а" "б" "с"
Попробуйте решение в лоб - преобразовать массив в allStringsList, в цикле перебрать элементы, посмотреть у каких нету повторений, закинуть их в какой-то отдельный uniqueElementsList и потом сделать allStringsList.removeAll(uniqueElementsList)
Код, который вы нашли, ничего толком не дает (относительно вашей задачи). По-сути, о нем можно забыть. Самый простой вариант "в лоб" сделать следующее:
Допустим вы имеет список (List) строк (то есть перевели массив в список) с именем input, тогда:
Создаете Map, где ключом является тип String, а значением Integer. Делаете цикл по списку и складываете в Map таким образом, чтобы в String ключе лежало строковое значение, а в Integer - количество повторений данной строки.
Обычно это проверяется так:
Map и ставим счетчик (Integer) в 0.
Если у вас список будет со значениями test, yo, test, ok, yo, test, hello, то на выходе должны получить:
Ключ Значение
---------------
test 2
yo 2
ok 1
hello 1
На втором шаге заводите результирующий список (result) и делаете еще раз цикл for с конца (это важно!) изначального заданного списка (input), до его начала и проверяете:
Какое число повторений занесено в Map со значением, которое сейчас выдается в итерации? Если больше 1, то заносите его в результирующий список.
Всё.
Дальше, если нужно, переводите список в массив.
Не удержался. С помощью стримов:
// Входные данные
List<String> list = new ArrayList<>(Arrays.asList("test", "yo", "ok",
"test", "hello",
"eak", "hello",
"test", "eak"));
// -----------------------------------------------------------------------
// Подсчитываем сколько раз встречается значение в списке
Map<String, Long> result = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// Удаляем из списка элементы, встречающиеся только один раз
list.removeIf(s -> result.get(s).intValue() == 1);
// -----------------------------------------------------------------------
// Output
System.out.println(list); // [test, test, hello, eak, hello, test, eak]
Без промежуточной переменной (Map<String, Long>):
list.removeIf(
s -> list.stream().collect(
Collectors.groupingBy(Function.identity(), Collectors.counting())
).get(s).intValue() == 1
);
Почитать подробно про stream API
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости