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