Есть массив строк, нужно удалить НЕповторяющиеся элементы.
Нашла минималистичный код для удаления повторяющихся элементов:
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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Разрабатываю приложение для заказа едыМеню иногда меняется, поэтому его необходимо получать приложению извне
Есть две таблицы, как я могу закрепить одну таблицу за другую? Пример:
Вроде бы все нормально расставлено, а на практике наоборотПри загрузке страницы и открытии мобильного (!) меню, его пункты оказываются под...
Есть HTML формаНа другом браузерах кнопка submit работает