Хотя использование IndexSet
в соответствии с @ vadian является хорошей идеей, оно работает только в вашем случае (последовательные и положительные целые числа) и может не являться вашей целью использовать индексы.Немного глупо использовать подобный вид объектов для этого, но хорошо справляется со своей задачей.
Возможный способ - использовать reduce()
:
let reduced = myNumbersArray.reduce([[Int]]()) { (current, next) -> [[Int]] in
var result = current
//Retrieve the last sequence, check if the current - last item of sequence is 1 to know if they are consecutive or not
if var lastSequence = result.last, let last = lastSequence.last, next-last == 1 {
lastSequence.append(next)
result[result.endIndex-1] = lastSequence
return result
} else { //It's not => New array of its own
result.append([next])
return result
}
}
print("reduced: \(reduced)")
Вывод:
$>reduced: [[1, 2, 3, 4], [10, 11], [15], [20, 21, 22, 23]]
В соответствии с предложением @ Leo Dabus , с reduce(into:)
:
let reducedInto = myNumbersArray.reduce(into: [[Int]]()) { (result, next) in
//Retrieve the last sequence, check if the current - last item of sequence is 1
if var lastSequence = result.last, let last = lastSequence.last, next-last == 1 {
lastSequence.append(next)
result[result.endIndex-1] = lastSequence
} else { //It's not => New array of its own
result.append([next])
}
}
print("reducedInto: \(reducedInto)")
Выход:
$>reducedInto: [[1, 2, 3, 4], [10, 11], [15], [20, 21, 22, 23]]