#arrays #swift #filter #duplicates
#массивы #быстрый #Фильтр #дубликаты
Вопрос:
Я хочу отфильтровать дублированные элементы до тех пор, пока с помощью Swift не появится новый элемент. и я хочу сделать это для всего массива.
Пример: [1,1,1,2,2,1]
Вывод: [1,2,1]
Комментарии:
1. Пожалуйста, покажите нам код вашей последней попытки и где вы застряли
2. На самом деле у меня есть база данных области, из которой я извлекаю массив, и в этом массиве у меня есть дублированные элементы, которые я хочу отфильтровать, чтобы иметь уникальные элементы в последовательности. если я поделюсь своим кодом здесь, это будет более запутанным, то, что я хочу иметь в своем выводе, — это то, что я описал выше.
Ответ №1:
Вы можете использовать reduce(into:_:)
для этого:
let array = [1,1,1,2,2,1] let filtered = array.reduce(into: [Int]()) { partialResult, current in guard let last = partialResult.last else { partialResult.append(current); return } if last != current { partialResult.append(current) } } print(filtered)
Мы перебираем массив. partialResult
заполняется ли текущий новый массив. Мы проверяем, есть ли уже начальное значение, иначе мы добавляем его. Затем мы сравниваем последнее значение partialResult
с текущим значением, повторенным в исходном массиве, чтобы решить, добавлять его или нет partialResult
Как только вы поймете логику, ее также можно будет написать с помощью:
let filtered2 = array.reduce(into: [Int]()) { partialResult, current in if partialResult.last != current { partialResult.append(current) } } print(filtered2)
Комментарии:
1. спасибо большое за ваш полезный ответ, не могли бы вы также помочь мне с этой проблемой, я использую базу данных realm, и когда я хочу добавить в partialResult, я получаю эту ошибку «Нет точных совпадений при вызове метода экземпляра «добавить»»
let data = RealmManager().fetchLocations(by: uuid) let filtered2 = data.reduce(into: [ActivityModel]()) { partialResult, current in if partialResult.last?.motionType != current.motionType { partialResult.append(current) } }
2. Это странно. Я попытался воспроизвести, но не смог допустить ошибки. Вы уверены
data
, что это а[ActivityModel]
? Если это [[Модель активности]], существует эта ошибка, но также и другая дляif
строки.