#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] }