gpt4 book ai didi

arrays - 查找和替换数组中多个项目的最快方法

转载 作者:行者123 更新时间:2023-11-30 11:54:17 24 4
gpt4 key购买 nike

我有两个数组,分别有大约 1000 个价格和大小,按从小到大的顺序排列,分别称为 tempArrayBuytempArraySell

let tempArrayBuy = [Orders]()
let tempArraySell = [Orders]()

struct Orders:Codable {
let price : Double
let size : Double

init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
price = Double(try container.decode(String.self)) ?? 0.0
size = Double(try container.decode(String.self)) ?? 0.0
}

init(_ orderEntryChange: OrderChangesFeed) {
price = orderEntryChange.price ?? 0.0
size = orderEntryChange.size ?? 0.0
}

}

我正在通过 websocket feed 获取需要对上面两个数组进行的更改。我需要在 tempArrayBuy 中找到正确的价格,并将该数量替换为 OrderBookChangesFeed 项目中的数量。

这是来自 websocket 的数据格式。我有一系列的改变。

let changesNeeded = [OrderChangesFeed]()

这是数据的结构。

struct OrderChangesFeed : Codable {
let side:String
let price : Double
let size : Double

init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
side = try container.decode(String.self)
price = Double(try container.decode(String.self)) ?? 0.0
size = Double(try container.decode(String.self)) ?? 0.0
}
}

如果一方是buy,则需要更新buyTempArray,如果是sell,则需要更新sellTempArray 。如果数组中不存在来自更改 websocket (OrderBookChangesFeed) 的价格,则需要添加给定的数量/大小,并且如果与更改 websocket 中的特定价格关联的数量/大小为 0 则需要将其从 tempArray 中删除。

这就是我现在正在做的事情。但我觉得有一种更快的方法可以做到这一点。我在一秒钟内得到大约 10-20+ 的变化,所以速度是这里最重要的事情。

for item in changesNeeded {
if item.side == "buy"{
if let tempInex = self.tempArrayBuy.index(where: {$0.price==item.price}) {
if item.size == 0 {
self.tempArrayBuy.remove(at: tempInex)
}else {
self.tempArrayBuy[tempInex] = Orders(item)
}
}else {
//Insert at the right spot in array. The array is sorted numerically by price. I am not sure what a fast way to do this would be.
}
}else {
//Do the same thing for sell side
}
}

我也不知道如何将其插入到正确的数字位置。对此的任何帮助都会很棒!

最佳答案

您的两个 Orders 数组不应该是数组,它们应该是以价格为键、大小为值的字典。

var tempBuy: [Double: Double] = [:]
var tempSell: [Double: Double] = [:]

要首先使用订单数组填写上面的字典,您可以:

tempBuy = Dictionary<Double, Double>(uniqueKeysWithValues: buyOrders.map { ($0.price, $0.size) }) // the same for the sell orders.

然后您可以简单地:

for item in changesNeeded {
switch item.side {
case "buy":
tempBuy[item.price] = item.size
case "sell":
tempSell[item.price] = item.size
default:
fatalError()
}
}

QED。

如果您确实需要这些东西的数组,那么:

var tempArrayBuy: [Orders] {
return tempBuy
.map { Orders(price: $0.0, size: $0.1) }
.sorted(by: { $0.price < $1.price })
}

-- 编辑--

如果您确实希望将它们保留为排序数组,请将整个事情包装在一个函数中。

func updateArrays(changesNeeded: [OrderChangesFeed], buy: inout [Orders], sell: inout [Orders]) {
var tempBuy = [Double: Double](uniqueKeysWithValues: buy.map { ($0.price, $0.size) })
var tempSell = [Double: Double](uniqueKeysWithValues: sell.map { ($0.price, $0.size) })
for item in changesNeeded {
switch item.side {
case "buy":
tempBuy[item.price] = item.size
case "sell":
tempSell[item.price] = item.size
default:
fatalError()
}
}
buy = tempBuy
.map { Orders(price: $0.0, size: $0.1) }
.sorted(by: { $0.price < $1.price })
sell = tempSell
.map { Orders(price: $0.0, size: $0.1) }
.sorted(by: { $0.price < $1.price })
}

关于arrays - 查找和替换数组中多个项目的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47999363/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com