Arrays 从Swift中的第二个数组导入
我有两个数组,一个是主数组(bookArray),另一个是更新列表(StockBookArray)。我使用下面的循环,使用两个数组中存在的唯一记录(isbn)将新数据导入waster数组 有没有办法提高下面循环的性能 更新数组可以包含与主数组不同的计数,有时多,有时少Arrays 从Swift中的第二个数组导入,arrays,xcode,swift,Arrays,Xcode,Swift,我有两个数组,一个是主数组(bookArray),另一个是更新列表(StockBookArray)。我使用下面的循环,使用两个数组中存在的唯一记录(isbn)将新数据导入waster数组 有没有办法提高下面循环的性能 更新数组可以包含与主数组不同的计数,有时多,有时少 for i in 0...stockBooksArray.count { let StockFiltered = stockBooksArray.filter{$0.isbn == bookArray[i].i
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
}
}
谢谢,
安东尼是的。现在,您正在为每个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
}
}
var j=0
用于StockBooks数组中的书{
而bookArray[j].isbn
如果您只是添加新的ISBN,您可以为每个ISBN获得一个NSMutableSet,执行setminusSet:
操作,从StockBookArray
中删除bookArray
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
}
使用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
}
}
bookArray.sort{(lhs,rhs)返回lhs.isbn
从iPad2上的5-6秒到几乎瞬间
非常感谢,,
Anthony是否存在衡量绩效的问题?即使不是简单的,也要比复杂的快一些,但要稍微快一些,不能明显快一些。“过早优化是万恶之源”——在旧设备上完成大约需要5-6秒,在最新设备(A8)上需要2秒。我们只是想让它尽可能快地在发布时排序。如果
stockBooksArray
有booksarray
没有的元素,该怎么办?如果bookArray
有stockbookarray
没有的元素,该怎么办?简单的分配能起作用吗?@Zaph“这不是过早的优化;它避免了无缘无故的悲观。”(Herb Sutter,Andrei Alexandrescu“C++编码标准”)是的,直到提供了时间安排后才知道这一点。