Вы можете sh выполнить то, что хотите, сначала отфильтровав индексы первого массива, в котором элемент является первым вхождением, в обратном порядке. Затем вам просто нужно отобразить подпоследовательности, используя их:
let rawArray: [[Float]] = [[1, 1, 1, 2, 2, 3, 3, 3, 3], [0.1, 0.15, 0.2, 0.05, 0.1, 0.2, 0.25, 0.3, 0.3]]
var set: Set<Float> = []
let indices = rawArray
.first?
.indices
.reversed()
.filter { set.insert(rawArray.first![$0]).inserted }
.reversed() ?? []
let result = rawArray.map { elements in indices.map { elements[$0] } }
print(result) // [[1, 2, 3], [0.2, 0.1, 0.3]]
Другой вариант - создать две пустые подпоследовательности, выполнить итерацию первых индексов подпоследовательностей rawArray в обратном порядке и попытаться вставить значение с плавающей точкой в набор, если вставлено добавление соответствующие элементы подпоследовательности, тогда вам просто нужно воссоздать результирующий массив с этими двумя новыми последовательностями в обратном порядке:
let rawArray: [[Float]] = [[1, 1, 1, 2, 2, 3, 3, 3, 3], [0.1, 0.15, 0.2, 0.05, 0.1, 0.2, 0.25, 0.3, 0.3]]
var set: Set<Float> = []
var sub1: [Float] = []
var sub2: [Float] = []
rawArray[0].indices.reversed().forEach {
let value = rawArray[0][$0]
if set.insert(value).inserted {
sub1.append(value)
sub2.append(rawArray[1][$0])
}
}
let result: [[Float]] = [sub1.reversed(), sub2.reversed()] // [[1, 2, 3], [0.2, 0.1, 0.3]]
Вы можете сделать это еще быстрее, если массив result
объявлен как обращенная коллекция плавающих точек. Это будет O (1) для [ReversedCollection<[Float]>]
вместо O (n) для [[Float]]
для каждой подпоследовательности.