Фильтровать массив с большинством вхождений элемента в swift - PullRequest
3 голосов
/ 13 января 2020

Мне нужно отфильтровать массив, в котором больше всего элементов.

Initial Array:

let array1 = [1,2,3,2,4,2,5,3]
let array2 = ["abc", "def", "abc", "ert", "def", "abc"]

После фильтрации, Final Array:

let filteredArray1 = [2,2,2]
let filteredArray2 = ["abc","abc","abc"]

У меня появилась идея получить отсчет элементов отсюда:

Как получить счетчик "ab c":

array2.filter{$0 == "abc"}.count

Но есть ли способ получить отфильтрованный массив?

Ответы [ 2 ]

6 голосов
/ 13 января 2020

Вы можете сгруппировать элементы в словарь и сравнить количество элементов в каждой группе

let mostFrequent = Dictionary(grouping: array1, by: {$0})
    .max(by: {$0.value.count < $1.value.count})?.value ?? []

Проблема с вышесказанным заключается в том, что если есть два или более значений с одинаковым количеством, то только один будет быть выбранным.

Приведенное ниже решение обрабатывает, когда есть многократные максимальные числа, я не мог написать это как выражение одной строки, хотя

let dictionary = Dictionary(grouping: array1, by: {$0})
let max = dictionary.max(by: {$0.value.count < $1.value.count})?.value.count ?? 0
let mostFrequent = dictionary.filter { $0.value.count == max }.values
3 голосов
/ 13 января 2020

Использование NSCountedSet ?

Вы можете определить это расширение для типа массива

extension Array where Element: Equatable {

    func filteredByMostPopular() -> [Element] {
        let countedSet = NSCountedSet(array: self)
        let mostPopularElement = self.max { countedSet.count(for: $0) < countedSet.count(for: $1) }
        return self.filter { $0 == mostPopularElement }
    }

}

Как это работает?

Расширение использует NSCountedSet для найдите «самый популярный» элемент.

Если 2 или более элементов являются самыми популярными, выбирается первый.

Затем массив фильтруется с использованием самых популярных элемент.

Тест

array1.filteredByMostPopular() // [2, 2, 2]
array2.filteredByMostPopular() // ["abc", "abc", "abc"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...