Удаление повторяющихся элементов в нескольких списках массивов swift

#arrays #swift

#массивы #swift

Вопрос:

 var brachNames = ["AP","AP","AP","AS","AS","AS","BR","BR","BR"]
var overAllTaget = ["84","84","84","84","84","84","84","84","84"]
var overAllSold = ["135","135","135","135","135","135","135","135","135"]    
  

 extension Array where Element : Hashable {
    func removeDups() -> [Element] {
        var uniquedElements = Set<Element>()
        return filter { uniquedElements.insert($0).inserted }
    }
}
   
  

Я хочу этот тип вывода — [AP, 84,135, AS, 84,135,BR,84,135]

Комментарии:

1. У набора нет заказов. Кроме того, почему у вас есть 3 массива, когда кажется, что это связанные данные (AP идет с 84 и 135)?

Ответ №1:

Поскольку у вас есть 3 разных Arrays , вам нужно сначала объединить их, чтобы получить Array Arrays использование zip(_:_:) и map(_:) , т.е.

 var arr = zip(brachNames, zip(overAllTaget, overAllSold)).map { [$0.0, $0.1.0, $0.1.1] }
  

Теперь используйте Set для фильтрации дубликатов. Затем используйте flatMap(_:) для получения одного result Array , т.е.

 let result = Array(Set(arr)).flatMap{ $0 } //["AP", "84", "135", "AS", "84", "135", "BR", "84", "135"]
  

Примечание: Set является неупорядоченным. Таким образом, последовательность result может измениться.

Комментарии:

1. Отлично. Примите (отметьте слева), если это помогло. Удачного кодирования 😊

Ответ №2:

Другим подходом было бы создать структуру с требуемыми полями (brachName, overallTarget, overallSold), соответствовать Hashable и применять что-то вроде этого:

https://www.hackingwithswift.com/example-code/language/how-to-remove-duplicate-items-from-an-array

Таким образом, вы могли бы сохранить порядок, если это важно.

Ответ №3:

Было бы намного лучше работать с массивом пользовательского типа вместо 3 разных массивов данных, чтобы сделать код более понятным и избежать простых ошибок при доступе к данным. Ниже приведен пример такого решения, использующего struct для хранения данных

 struct BranchData: Hashable {
    let branchName: String
    let overallTarget: Int
    let overallSold: Int
}

var set = Set<BranchData>()

for (index, branch) in brachNames.enumerated() {
    guard index < overAllSold.count, index < overAllTaget.count else {
        break
    }
    set.insert(BranchData(branchName: branch, overallTarget: Int(overAllTaget[index]) ?? 0, overallSold: Int(overAllSold[index]) ?? 0))
}
  

Для поддержки конкретного вывода со всеми значениями в массиве мы можем добавить вычисляемое свойство

 extension BranchData {
    var propertyArray: [String] {
        [branchName, String(overallTarget), String(overallSold)]
    }
}

let output = set.flatMap { $0.propertyArray }
  

или более прямой подход

 let output = set.flatMap { [$0.branchName, $0.overallTarget, $0.overallSold] }