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

320
21 мая 2017, 21:15

Есть массив строк, нужно удалить НЕповторяющиеся элементы.
Нашла минималистичный код для удаления повторяющихся элементов:

Set<String> set = new HashSet<String>(Arrays.asList(str));
String[] result = set.toArray(new String[set.size()]);

Но из-за его минималистичности не могу понять, каким образом преобразовать его в то, что нужно мне.

Answer 1
Set set = new HashSet(Arrays.asList(str));

Set - коллекция уникальных элементов, т.е. там нет одинаковых)

String[] result = set.toArray(new String[set.size()]);

тут идет обычное преобразование сета в массив. В итоге result - массив всех элементов без их дубликатов. Т.е. если было "абв" "а" "абв" "б" "с" "а" то станет "абв" "а" "б" "с"

Попробуйте решение в лоб - преобразовать массив в allStringsList, в цикле перебрать элементы, посмотреть у каких нету повторений, закинуть их в какой-то отдельный uniqueElementsList и потом сделать allStringsList.removeAll(uniqueElementsList)

Answer 2

Код, который вы нашли, ничего толком не дает (относительно вашей задачи). По-сути, о нем можно забыть. Самый простой вариант "в лоб" сделать следующее:

Допустим вы имеет список (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<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

READ ALSO
Хранение данных вне приложения android (JSON)

Хранение данных вне приложения android (JSON)

Разрабатываю приложение для заказа едыМеню иногда меняется, поэтому его необходимо получать приложению извне

254
Можно ли закрепить элемент за другим по ID

Можно ли закрепить элемент за другим по ID

Есть две таблицы, как я могу закрепить одну таблицу за другую? Пример:

242
Распорядок в z-index&#39;ах

Распорядок в z-index'ах

Вроде бы все нормально расставлено, а на практике наоборотПри загрузке страницы и открытии мобильного (!) меню, его пункты оказываются под...

215
HTML форма не работает в APPLE устройствах

HTML форма не работает в APPLE устройствах

Есть HTML формаНа другом браузерах кнопка submit работает

256