Выравнивание многоуровневого массива в Swift (Flattening of multi level Array in Swift)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет! На собеседованиях время от времени встречается вопрос как выравнить многоуровневый массив.

Если это простой двухуровневый массив вида [[1, 2], [3, 4]], то нам поможет стандартная функция высшего порядка flatMap() хоть она и деприкейтнута, но все еще доступна для использования.

Но что если нам нужно нужно выровнять более сложные массивы, например:

[1, [2]] -> [1, 2]

[1, [2, 3]] -> [1, 2, 3]

[1, [2, [3, [4]]]] -> [1, 2, 3, 4]

В этом случае мы можем написать свою рекурсивную функцию:

func flattFunction(array:[Any]) -> [Int] {
    var flattenArray = [Int]()
    
    for element in array {
        if let element = element as? Int {
            flattenArray.append(element)
        } else if let element = element as? [Any] {
            let result = flattFunction(array: element)
            flattenArray += result
        }
    }
    
    return flattenArray
}

Протестируем:

let arr1 = [1]
let arr2 = [1, 2, 3]
let arr3: [Any] = [1, [2]]
let arr4: [Any] = [1, [2, 3]]
let arr5: [Any] = [1, [2, [3, [4]]]]

func testFlattFunc() {
    print(flattFunction(array: arr1))
    print(flattFunction(array: arr2))
    print(flattFunction(array: arr3))
    print(flattFunction(array: arr4))
    print(flattFunction(array: arr5))
}

testFlattFunc()

// Вывод:
// [1]
// [1, 2, 3]
// [1, 2]
// [1, 2, 3]
// [1, 2, 3, 4]

Надеюсь это небольшая заметка окажется полезной.

Источник: https://habr.com/ru/articles/807265/


Интересные статьи

Интересные статьи

Как часто вам приходится сталкиваться с конструкцией sizeof(array)/sizeof(array[0]) для определения размера массива? Очень надеюсь, что не часто, ведь на дворе уже 2024 год. В заметке поговорим о недо...
За годы работы разработчиком iOS, я собрал множество инструментов и полезных штук, которые облегчают процесс разработки. В этой статье, я хочу поделиться одним из таких инструментов. Это будет не боль...
Привет! Меня зовут Андрей, я iOS-разработчик приложения “Пункт Ozon”. С помощью него сотрудники пунктов выдачи Ozon выдают посылки, принимают возвраты, проводят инвентаризации. Мы хотим упростить...
Всем привет, меня зовут Сергей, я работаю в компании Joy Dev в должности iOS TeamLead. Эта статья - моя “проба пера” на Хабре. В ней, вместе с обзором видов диспетчеризации в Swift, мы рассмотрим неск...
Эту неделю я решил посвятить потокам данных в SwiftUI. В этой статье мы обсудим разницу между обертками свойств (property wrappers) @StateObject, @EnvironmentObject, и @O...