Какой хороший способ повторить итерации через символы строки?
Какой самый быстрый способ итерации назад через символы в строке? т.е. как for ch in str
, только в обратном направлении?
Я думаю, что я должен упустить что-то очевидное, потому что самое лучшее, что я мог придумать сейчас:
for var index = str.endIndex;
index != str.startIndex;
index = index.predecessor() {
let ch = str[index.predecessor()]
...
}
Я понимаю, "что лучше..." можно классифицировать как субъективное; Я полагаю, что то, что я действительно ищу, - это краткая, но читаемая форма этого.
Изменить: хотя функция reverse() работает и является кратким, похоже, что это может быть довольно неэффективно по сравнению с предыдущим, т.е. кажется, что он фактически не выполняет итерацию назад, а создает полную обратную копию символов в String. Это было бы намного хуже, чем мой оригинал, если, скажем, вы искали что-то, что обычно было несколько символов с конца строки в 10 000 символов. Поэтому я оставляю этот вопрос открытым, чтобы привлечь другие подходы.
Ответы
Ответ 1
Функция reversed
меняет направление C: CollectionType
и возвращает a ReversedCollection
:
for char in "string".characters.reversed() {
// ...
}
Если вы обнаружите, что reversed
предварительно инвертирует строку, попробуйте:
for char in "string".characters.lazy.reversed() {
// ...
}
lazy
возвращает лениво оцененную последовательность (LazyBidirectionalCollection
), тогда reversed()
возвращает другую LazyBidirectionalCollection
, которая посещается в обратном порядке.
Ответ 2
По состоянию на декабрь 2015 года с Swift версии 2.1 правильный способ сделать это
for char in string.characters.reverse() {
//loop backwards
}
Строка больше не соответствует SequenceType<T>
, но ее набор символов делает.
Ответ 3
Не уверен в эффективности, но я предлагаю
for ch in reverse(str) {
println(ch)
}
Ответ 4
Вот код для изменения строки, которая не использует reverse (str)
// Reverse String
func myReverse(str:String) -> String {
var buffer = ""
for character in str {
buffer.insert(character, atIndex: buffer.startIndex)
}
return buffer
}
myReverse("Paul") // gives "luaP"
Небольшой эксперимент. За что его стоит.
Хорошо, наклонился, как читать вопрос....
Будет ли это работать Мэттом?
func ReverseIteration(str:String) {
func myReverse(str:String) -> String {
var buffer = ""
for character in str {
buffer.insert(character, atIndex: buffer.startIndex)
}
return buffer
}
// reverse string then iterate forward.
var newStr = myReverse(str)
for char in newStr {
println(char)
// do some code here
}
Ответ 5
extension String {
var reverse: String {
var reverseStr = ""
for character in self {
reverseStr = String(character) + reverseStr
}
return reverseStr
}
}