/ / Група сортирани комплекти със същия индекс - бърз

Група сортирани комплекти със същия индекс - бърз

Да кажем, че имаме сортиран масив като:

let sortedArray = [(A, 0), (B, 1), (C, 1), (D, 2), (E, 2), (F, 2)]

Как мога да ги групирам със същия втори параметър в tuple като:

let result = [
([A], 0),
([B, C], 1),
([D, E, F], 2)
]

[B, C] и [D, E, F] наследяване на същата поръчка от сортирания масив.

Редактиране:

Имам този код на моята детска площадка, опитвайки се да бягам

let origin: [(String, Int)] = [("0", 0), ("1", 1), ("2", 1), ("2", 2), ("3", 2)]
if let last = origin.last {
let array = Array<([String], Int)>.init(repeating: ([], 0), count: last.1)

for (index, ele) in origin.enumerated() {
var b = array[index] as? ([String], Int)
b?.0.append(ele.0)
}
}

Отговори:

2 за отговор № 1

Можеш да използваш reduce(into:) комбинирано с index(where:) метод. Ако откриете, че индексът на цялото число добавя нов низ към масива, в противен случай ще добави нов елемент на плика с един низ масив и съответното цяло число:

let sortedArray:[(string: String, integer: Int)] = [("A", 0), ("B", 1), ("C", 1), ("D", 2), ("E", 2), ("F", 2)]
let grouped = sortedArray.reduce(into: [(strings:[String], integer: Int)]()) { partial, tuple in

if let index = partial.index(where: {$0.integer == tuple.integer }) {
partial[index].strings.append(tuple.string)
} else {
partial.append(([tuple.string], tuple.integer))
}
}


print(grouped)

Това ще отпечата:

[("С", "E", "F"], ("С", " цяло число: 2)]

Ако не искате да наименувате елементите си от типа:

let sortedArray = [("A", 0), ("B", 1), ("C", 1), ("D", 2), ("E", 2), ("F", 2)]
let grouped = sortedArray.reduce(into: [([String],Int)]()) { partial, tuple in
if let index = partial.index(where: {$0.1 == tuple.1 }) {
partial[index].0.append(tuple.0)
} else {
partial.append(([tuple.0], tuple.1))
}
}