Страницы

Поиск по вопросам

пятница, 2 ноября 2018 г.

Удалить слова, встречающиеся один раз из массива строк

Есть массив строк, нужно удалить НЕповторяющиеся элементы. Нашла минималистичный код для удаления повторяющихся элементов:
Set set = new HashSet(Arrays.asList(str)); String[] result = set.toArray(new String[set.size()]);
Но из-за его минималистичности не могу понять, каким образом преобразовать его в то, что нужно мне.


Ответ

Код, который вы нашли, ничего толком не дает (относительно вашей задачи). По сути, о нем можно просто забыть. Самый простой вариант "в лоб" сделать следующее:
Допустим вы имеет список (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 list = new ArrayList<>(Arrays.asList("test", "yo", "ok", "test", "hello", "eak", "hello", "test", "eak")); // ----------------------------------------------------------------------- // Подсчитываем сколько раз встречается значение в списке Map 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):
list.removeIf( s -> list.stream().collect( Collectors.groupingBy(Function.identity(), Collectors.counting()) ).get(s).intValue() == 1 );
Почитать подробно про stream API

Комментариев нет:

Отправить комментарий