我有2个数组,1个是master(bookArray),另一个是更新列表(stockBooksArray)。我使用下面的循环使用两个数组中都存在的唯一记录(isbn)将新数据导入到waster数组中。
有没有办法改善下面循环的性能?
更新数组可以包含与主服务器不同的计数,有时更多,有时更少。
for i in 0...stockBooksArray.count {
let StockFiltered = stockBooksArray.filter{$0.isbn == bookArray[i].isbn}
if StockFiltered.count != 0 {
bookArray[i].stockAmount = StockFiltered[0].Stock
bookArray[i].unitCost = StockFiltered[0].Cost
bookArray[i].dues = StockFiltered[0].dues
bookArray[i].stockRRP = StockFiltered[0].RRP
}
}
谢谢, 安东尼
答案 0 :(得分:1)
是的。现在,您为每个stockBooksArray对象循环遍历bookArray数组。那个O(N * M)非常糟糕。
相反,如果您可以按ISBN对两个数组进行排序,那么您可以同时单步执行这两个数组,只访问每个元素一次,这将是O(N)。即使您有时间对它们进行排序,也要快得多。
我把下面的代码很快地放在了一起。它假设两个数组都按isbn排序。我想你会发现这个速度要快得多。
var j = 0
for book in stockBooksArray {
while bookArray[j].isbn < book.isbn && j < bookArray.count {
++j;
}
if j == bookArray.count {
break
}
else if bookArray[j].isbn == book.isbn {
bookArray[j].stockAmount = StockFiltered[0].Stock
bookArray[j].unitCost = StockFiltered[0].Cost
bookArray[j].dues = StockFiltered[0].dues
bookArray[j].stockRRP = StockFiltered[0].RRP
}
}
答案 1 :(得分:0)
如果你只是添加新的,你可以获得每个ISBN的NSMutableSet,执行一组minusSet:
操作从bookArray
删除stockBooksArray
ISBN,然后只需添加结果ISBN到bookArray
。
未经测试的概念代码,根据需要转换为Swift:
NSMutableSet *stockBooksSet = NSMutableSet setWithArray:[stockBooksSet valueForKey:@"isbn"];
NSSet *booksSet = NSSet setWithArray:[bookArray valueForKey:@"isbn"];
[stockBooksSet minusSet: booksSet];
for (NSString *isbn in stockBooksSet) {
// add book with ism to booksSet
}
答案 2 :(得分:0)
使用Daniel T.方法更新了代码。
bookArray.sort { (lhs, rhs) in return lhs.isbn < rhs.isbn }
stockBooksArray.sort { (lhs, rhs) in return lhs.isbn < rhs.isbn }
var j = 0
for book in stockBooksArray {
while bookArray[j].isbn < book.isbn && j < bookArray.count {
++j
}
if j == bookArray.count {
break
}
else if bookArray[j].isbn == book.isbn {
bookArray[j].stockAmount = book.Stock
bookArray[j].unitCost = book.Cost
bookArray[j].dues = book.dues
bookArray[j].stockRRP = book.RRP
}
}
从iPad2上的5-6秒到几乎即时。
非常感谢, 安东尼