滤波器阵列,根据另一个阵列的滤波器



有两个数组-第一个是关于日期的,第二个显示当天的支出:

var arrayOfDates = [01.07, 01.07, 03.07, 04.07, 05.07, 05.07, 05.07]
var arrayofCosts = [3, 8, 2, 2, 8, 6, 9]

我想过滤arrayOfDates中的唯一元素。在第二个数组中显示了每天的最高价值支出。所以结果应该是:

var arrayOfDatesModifed = [01.07, 3.07, 04.07, 05.07]
var arrayofNumbersModifed = [8, 2, 2, 9]

因此,这个想法由三个阶段组成:

  1. 为唯一元素筛选arrayOfDates
  2. 对于每个唯一的日期,在arrayofCosts中查找相应的项目
  3. arrayofCosts中查找每个日期的最大值

虽然这些任务中的每一项都可能很简单,但我不知道如何完全完成它们。将非常感谢您的帮助

我同意那些有意见的人。使用单个数组将是一件非常痛苦的事情。

让我们实现一个结构来保存我们的数据。

struct Entry: CustomStringConvertible {
let date: Double
let cost: Int
var description: String {
"((date), (cost))"
}
}

这些只是您的示例中的条目:

let entries: [Entry] = [
.init(date: 01.07, cost: 3),
.init(date: 01.07, cost: 8),
.init(date: 03.07, cost: 2),
.init(date: 04.07, cost: 2),
.init(date: 05.07, cost: 8),
.init(date: 05.07, cost: 6),
.init(date: 05.07, cost: 9),
]

我要做的第一件事是按日期对所有条目进行分组:

let groupedEntries = Dictionary(grouping: entries) { $0.date }
print(groupedEntries)

这给了我们一个无序的字典,其中键是日期,值是具有相同日期的条目数组:

[1.07: [(1.07, 3), (1.07, 8)], 5.07: [(5.07, 8), (5.07, 6), (5.07, 9)], 3.07: [(3.07, 2)], 4.07: [(4.07, 2)]]

我要做的下一件事是提取每组中成本最高的条目,并丢弃成本较低的条目。我们不需要这些。因此,现在我们有一个条目数组,其中低成本元素已被过滤掉。

let uniqueDateMaxEntry = groupedEntries.compactMap { _, entries in
return entries.max(by: { $0.cost < $1.cost })
}
print(uniqueDateMaxEntry)

这给了我们:

[(1.07, 8), (4.07, 2), (5.07, 9), (3.07, 2)]

正如您所看到的,数组不是按日期排序的。所以我们现在可以这样做

let sortedUniqueDateMaxEntry = uniqueDateMaxEntry
.sorted { $0.date < $1.date }
print(sortedUniqueDateMaxEntry)

最后,这给了我们:

[(1.07, 8), (3.07, 2), (4.07, 2), (5.07, 9)]
var arrayOfDates = [01.07, 01.07, 03.07, 04.07, 05.07, 05.07, 05.07]
var arrayofCosts = [3, 8, 2, 2, 8, 6, 9]
var item = 0.0
var arrayOfDatesModified = [Double]()
var arrayOfCostsModified = [Int]()
var maxCosts = 0
var indexFor = 0
//Enumerated function helps to get the element with corresponding index
for (index, element) in arrayOfDates.enumerated() {
let cost = arrayofCosts[index]
///If item is not same as before then its the new item - 01.07(new), 01.07(old), 03.07(new)
if item != element {
item = element
maxCosts = cost
arrayOfDatesModified.append(item)
arrayOfCostsModified.insert(maxCosts, at: arrayOfDatesModified.count - 1)
} else {
///If same element cost is higher then replacing with the higher cost
if maxCosts < cost {
maxCosts = cost
arrayOfCostsModified.remove(at: arrayOfDatesModified.count - 1)
arrayOfCostsModified.insert(maxCosts, at: arrayOfDatesModified.count - 1)
}
}
}
print(arrayOfDatesModified)
print(arrayOfCostsModified)

上述简单的for循环也是解决方案,但它不是优化的
swift语言在最新版本中有许多先进的概念,我们应该避免使用上述复杂的方法来解决问题。

  1. 不必要的变量声明
  2. 时间和空间更加复杂
  3. 缺少概念映射过滤器和结构、分组等

这只是一个例子:不应该为当前的情况解决问题,也应该考虑未来的前景
这不是你的解决方案Sergey_VC,只是试图帮助在Online中尝试快速修复的人。

最新更新