#java #массивы
Есть массив строк, нужно удалить НЕповторяющиеся элементы. Нашла минималистичный код для удаления повторяющихся элементов: Setset = new HashSet (Arrays.asList(str)); String[] result = set.toArray(new String[set.size()]); Но из-за его минималистичности не могу понять, каким образом преобразовать его в то, что нужно мне.
Ответы
Ответ 1
Код, который вы нашли, ничего толком не дает (относительно вашей задачи). По сути, о нем можно просто забыть. Самый простой вариант "в лоб" сделать следующее: Допустим вы имеет список (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, то заносите его в результирующий список. Всё. Дальше, если нужно, переводите список в массив. Не удержался. С помощью стримов: // Входные данные Listlist = 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 Ответ 2
Set set = new HashSet(Arrays.asList(str)); Set - коллекция уникальных элементов, т.е. там нет одинаковых) String[] result = set.toArray(new String[set.size()]); тут идет обычное преобразование сета в массив. В итоге result - массив всех элементов без их дубликатов. Т.е. если было "абв" "а" "абв" "б" "с" "а" то станет "абв" "а" "б" "с" Попробуйте решение в лоб - преобразовать массив в allStringsList, в цикле перебрать элементы, посмотреть у каких нету повторений, закинуть их в какой-то отдельный uniqueElementsList и потом сделать allStringsList.removeAll(uniqueElementsList)
Комментариев нет:
Отправить комментарий