Например:
Я пытался перебирать строку
Вот мой код с итерацией строки, чтобы узнать повторяющийся символ в строке.
func countRepeatDigitsIn(keyword : String) -> Int
{
// To keep track of processed symbols
var uniqueCharacters = ""
var repeatCharacterCount = 0
for char in keyword.uppercased() {
let alphabet = String(char)
// If this is already counted, skip it
if (uniqueCharacters.contains(alphabet))
{
repeatCharacterCount += 1
}
// Otherwise, add it to processed symbols
uniqueCharacters += alphabet
}
return repeatCharacterCount
}
Не судите заранее о лучшем способе, решив заранее, что лучше использовать регулярное выражение. Просто задайте свой вопрос и покажите код.
HelloWorld - repeated characters are 5 (l is repeating 3 times and o is repeating 2 times
Самый простой способ получить этот результат — взять гистограмму, а затем сложить все значения, отличные от 1.
Пример:
func histogram(_ s:String) -> [Character:Int] {
var d = [Character:Int]()
for c in s {
d[c, default:0] += 1
}
return d
}
let reps = histogram("helloworld").values.filter{$0 > 1}.reduce(0, +) // 5
let reps2 = histogram("smart2000").values.filter{$0 > 1}.reduce(0, +) // 3
let reps3 = histogram("Smart@200@12").values.filter{$0 > 1}.reduce(0, +) // 6
+1 за решение. Как насчет использования reduce
непосредственно в словаре подсчета символов как histogram("helloworld").reduce(0, { $0 + ($1.value > 1 ? $1.value : 0)})
Вот забавная цепочка сокращений и фильтров по символам строки.
func countRepeatDigitsIn(keyword : String) -> Int {
let total = Array(keyword.uppercased()).reduce(into: [Character : Int]()) { $0[$1, default: 0] += 1 }.filter { $0.value > 1 }.reduce(0) { $0 + $1.value }
return total
}
for text in ["HelloWorld", "Smart2000", "Smart@200@12"] {
print(text, countRepeatDigitsIn(keyword: text))
}
Первый reduce
строит словарь, где ключи — это символы, а значения — это количество символов. Затем фильтр удаляет символы, найденные только один раз. Второе сокращение добавляет оставшиеся счетчики.
Сгруппируйте одинаковые символы в словаре, используя Словарь (группировка: по:), и добавьте количество значений, где количество больше 1.
extension String {
func repeatCount() -> Int {
return Dictionary(grouping: lowercased()) { $0 }.values.filter { $0.count > 1 }.reduce(0) { $0 + $1.count }
}
}
print("HelloWorLd".repeatCount())//5
print("Smart2000".repeatCount())//3
print("Smart@200@12".repeatCount())//6
Регулярное выражение - это не то, что вам нужно для этого.