Подсчет вхождений букв в String Swift - PullRequest
0 голосов
/ 01 октября 2018

Нашел симпатичный способ подсчета вхождений символов в строку:

let inputString = "test this string"
var frequencies : [Character: Int] = [:]

let baseCounts = zip(
    inputString, repeatElement(1,count: Int.max))
frequencies = Dictionary(baseCounts, uniquingKeysWith: +)

с результатом

["i": 2, "r": 1, «n»: 1, «e»: 1, «s»: 3, «»: 2, «g»: 1, «t»: 4, «h»: 1]

Однако я попытался использовать диапазон для таких элементов, что

let secondBaseCounts = zip(inputString, 0...)
frequencies = Dictionary(secondBaseCounts, uniquingKeysWith: +)

, но получил неправильный результат:

["i": 20, "r": 12,«n»: 14, «e»: 1, «s»: 20, «»: 13, «g»: 15, «t»: 19, «h»: 6]

Почему?

1 Ответ

0 голосов
/ 01 октября 2018

Ваша вторая попытка не реализует то, что вы хотели реализовать.zip(inputString, 0...) просто сопоставляет индекс Int каждого символа с самим символом.

Таким образом, значение secondBaseCounts будет

["t", 0),("e", 1), ("s", 2), ("t", 3), ("", 4), ("t", 5), ("h", 6), ("i", 7), (" s ", 8), (" ", 9), (" s ", 10), (" t ", 11), (" r ", 12), (" i ", 13), ("n", 14), ("g", 15)]

Вызов Dictionary(secondBaseCounts, uniquingKeysWith: +) суммирует каждое значение, связанное с повторяющимися ключами, означая, что значения в вашем окончательном словаре frequenciesбудет суммой всех индексов, где определенный символ встречается в inputString, а не количеством вхождений этого символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...