Помогите разобрать на части [[String]]


#1

Всем привет. Парни, нужна помощь. Гуголь уже отрекся.
Есть массив типа такого:
[[“1”, «Section 1"], [“1.1”, «Item 1.1"], [“1.1.1”, «subItem 1.1.1"], [“1.1.2”, “subItem 1.1.2”], [“1.1.3”, “subItem 1.1.3”], [“1.1.4”, “subItem 1.1.4”], [“1.1.5”, “subItem 1.1.5”], [“1.1.6”, “subItem 1.1.6”], [“1.1.7”, “subItem 1.1.7”], [“1.2”, “Item 1.2”], [“1.2.1”, “subItem 1.2.1”], [“1.2.2”, “subItem 1.2.2”], [“1.2.3”, “subItem 1.2.3”], [“1.2.4”, “subItem 1.2.4”], [“1.2.5”, “subItem 1.2.5”], [“1.2.6”, “subItem 1.2.6”], [“1.2.7”, “subItem 1.2.7”], [“1.2.8”, “subItem 1.2.8”], [“1.2.9”, “subItem 1.2.9”], [“1.2.10”, “subItem 1.2.10”], [“1.2.11”, “subItem 1.2.11”], [“1.2.12”, “subItem 1.2.12”], [“1.2.13”, “subItem 1.2.13”], [“1.3”, “Item 1.3”], [“1.3.1”, “subItem 1.3.1”], [“1.3.2”, “subItem 1.3.2”], [“1.3.3”, “subItem 1.3.3”], [“1.3.4”, “subItem 1.3.4”], [“1.3.5”, “subItem 1.3.5”], [“1.3.6”, “subItem 1.3.6”], [“1.3.7”, “subItem 1.3.7”], [“1.3.8”, “subItem 1.3.8”], [“1.3.9”, “subItem 1.3.9”], [“1.3.10”, “subItem 1.3.10”], [“2”, “Раздел 2”], [“2.1”, “Item 2.1”], [“2.1.1”, “subItem 2.1.1”], [“2.1.2”, “subItem 2.1.2”], [“2.1.3”, “subItem 2.1.3”], [“2.1.4”, “subItem 2.1.4”], [“2.1.5”, “subItem 2.1.5”], [“2.1.6”, “subItem 2.1.6”], [“2.1.7”, “subItem 2.1.7”], [“2.1.8”, “subItem 2.1.8”], [“2.1.9”, “subItem 2.1.9”], [“2.1.10”, “subItem 2.1.10”], [“2.1.11”, “subItem 2.1.11”], [“2.1.12”, “subItem 2.1.12”], [“2.1.13”, “subItem 2.1.13”], [“2.2”, “Item 2.2”], [“2.2.1”, “subItem 2.2.1”], [“2.3”, “Item 2.3”], [“2.3.1”, “subItem 2.3.1”], [“2.4”, “Item 2.4”], [“2.4.1”, “subItem 2.4.1”], [“2.4.2”, “subItem 2.4.2”], [“2.4.3”, “subItem 2.4.3”], [“2.4.4”, “subItem 2.4.4”], [“2.4.5”, “subItem 2.4.5”], [“2.4.6”, “subItem 2.4.6”], [“2.4.7”, “subItem 2.4.7”], [“2.5”, “Item 2.5”], [“2.5.1”, “subItem 2.5.1”], [“2.5.2”, “subItem 2.5.2”], [“2.5.4”, “subItem 2.5.3”], [“2.5.5”, “subItem 2.5.4”], [“2.5.6”, “subItem 2.5.5”], [“2.5.7”, “subItem 2.5.6”], [“2.5.8”, “subItem 2.5.7”], [“2.5.9”, “subItem 2.5.8”], [“2.5.10”, “subItem 2.5.9”], [“2.6”, “Item 2.6”], [“2.6.1”, “subItem 2.6.1”], [“2.6.2”, “subItem 2.6.2”], [“2.6.3”, “subItem 2.6.3”], [“2.6.4”, “subItem 2.6.4”]]

Не понимаю как можно его отсортировать (либо в структуру, либо в отдельные массивы).
Цель: есть VC1 с tableView где отображается sections и Items. Тапаем на ячейку с Item и переходим на VC2 где tableView с subItem. Пожалуйста, объясните, как лучше решить эту задачу. Поменять индексы (как 2.4.7) я не могу, и точное число элементов массива - непредсказуемо. Благодарю. Хороших выходных.


#2

На это сообщение поступили жалобы от участников сообщества, поэтому оно временно скрыто.


#3
let array = [
    ["1", "Section 1"],
    ["1.1", "Item 1.1"],
    ["1.1.1", "subItem 1.1.1"],
    ["1.1.2", "subItem 1.1.2"],
    ["1.1.3", "subItem 1.1.3"],
    ["1.1.4", "subItem 1.1.4"],
    ["1.1.5", "subItem 1.1.5"],
    ["1.1.6", "subItem 1.1.6"],
    ["1.1.7", "subItem 1.1.7"],
    ["1.2", "Item 1.2"],
    ["1.2.1", "subItem 1.2.1"],
    ["1.2.2", "subItem 1.2.2"],
    ["1.2.3", "subItem 1.2.3"],
    ["1.2.4", "subItem 1.2.4"],
    ["1.2.5", "subItem 1.2.5"],
    ["1.2.6", "subItem 1.2.6"],
    ["1.2.7", "subItem 1.2.7"],
    ["1.2.8", "subItem 1.2.8"],
    ["1.2.9", "subItem 1.2.9"],
    ["1.2.10", "subItem 1.2.10"],
    ["1.2.11", "subItem 1.2.11"],
    ["1.2.12", "subItem 1.2.12"],
    ["1.2.13", "subItem 1.2.13"],
    ["1.3", "Item 1.3"],
    ["1.3.1", "subItem 1.3.1"],
    ["1.3.2", "subItem 1.3.2"],
    ["1.3.3", "subItem 1.3.3"],
    ["1.3.4", "subItem 1.3.4"],
    ["1.3.5", "subItem 1.3.5"],
    ["1.3.6", "subItem 1.3.6"],
    ["1.3.7", "subItem 1.3.7"],
    ["1.3.8", "subItem 1.3.8"],
    ["1.3.9", "subItem 1.3.9"],
    ["1.3.10", "subItem 1.3.10"],
    ["2", "Раздел 2"],
    ["2.1", "Item 2.1"],
    ["2.1.1", "subItem 2.1.1"],
    ["2.1.2", "subItem 2.1.2"],
    ["2.1.3", "subItem 2.1.3"],
    ["2.1.4", "subItem 2.1.4"],
    ["2.1.5", "subItem 2.1.5"],
    ["2.1.6", "subItem 2.1.6"],
    ["2.1.7", "subItem 2.1.7"],
    ["2.1.8", "subItem 2.1.8"],
    ["2.1.9", "subItem 2.1.9"],
    ["2.1.10", "subItem 2.1.10"],
    ["2.1.11", "subItem 2.1.11"],
    ["2.1.12", "subItem 2.1.12"],
    ["2.1.13", "subItem 2.1.13"],
    ["2.2", "Item 2.2"],
    ["2.2.1", "subItem 2.2.1"],
    ["2.3", "Item 2.3"],
    ["2.3.1", "subItem 2.3.1"],
    ["2.4", "Item 2.4"],
    ["2.4.1", "subItem 2.4.1"],
    ["2.4.2", "subItem 2.4.2"],
    ["2.4.3", "subItem 2.4.3"],
    ["2.4.4", "subItem 2.4.4"],
    ["2.4.5", "subItem 2.4.5"],
    ["2.4.6", "subItem 2.4.6"],
    ["2.4.7", "subItem 2.4.7"],
    ["2.5", "Item 2.5"],
    ["2.5.1", "subItem 2.5.1"],
    ["2.5.2", "subItem 2.5.2"],
    ["2.5.4", "subItem 2.5.3"],
    ["2.5.5", "subItem 2.5.4"],
    ["2.5.6", "subItem 2.5.5"],
    ["2.5.7", "subItem 2.5.6"],
    ["2.5.8", "subItem 2.5.7"],
    ["2.5.9", "subItem 2.5.8"],
    ["2.5.10", "subItem 2.5.9"],
    ["2.6", "Item 2.6"],
    ["2.6.1", "subItem 2.6.1"],
    ["2.6.2", "subItem 2.6.2"],
    ["2.6.3", "subItem 2.6.3"],
    ["2.6.4", "subItem 2.6.4"]
]

class Item: CustomStringConvertible {
    let position: [Int]
    let name: String
    var childs: [Item]?
    init?(position: String?, name: String?) {
        guard let position = position, let name = name else { return nil }
        self.position = position.components(separatedBy: ".").flatMap { Int($0) }
        self.name = name
    }
    var description: String {
        return "name: \(name) position: \(position)"
    }
}

func superSort(items: [Item]) -> [Item] {
    let sections: [[Item]] = {
        var result = [[Item]]()
        var pCount = 1
        while true {
            let section = items.filter { $0.position.count == pCount }
            guard !section.isEmpty else { break }
            let sort = { (item0: Item, item1: Item) -> Bool in
                let index0 = Int(item0.position.map { $0.description }.joined())!
                let index1 = Int(item1.position.map { $0.description }.joined())!
                return index0 < index1
            }
            result.append(section.sorted(by: sort))
            pCount += 1
        }
        return result
    }()
    for i in 0..<sections.count where i + 1 < sections.count {
        let items = sections[i...i + 1]
        let equals = { (parent: [Int], child: [Int]) -> Bool in
            for (index, position) in parent.enumerated() where position != child[index] {
                return false
            }
            return true
        }
        let parents = items.first!
        let childs = items.last!
        parents.forEach { item in item.childs = childs.filter { equals(item.position, $0.position) } }
    }
    return sections.first!
}

func printItems(_ space: String = "", items: [Item]) {
    items.forEach { item in
        print(space + item.description)
        if let childs = item.childs {
            printItems(space + "   ", items: childs)
        }
    }
}

let items = superSort(items: array.flatMap { Item(position: $0.first, name: $0.last) })

printItems(items: items)

:slight_smile:


#4

Парень… ты крут) Спасибо большое) Отличная работа. Еще раз спасибо!