Arrays 从Swift中的第二个数组导入

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

我有两个数组,一个是主数组(bookArray),另一个是更新列表(StockBookArray)。我使用下面的循环,使用两个数组中存在的唯一记录(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

            }
        }
谢谢,
安东尼

是的。现在,您正在为每个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,执行set
minusSet:
操作,从
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++编码标准”)是的,直到提供了时间安排后才知道这一点。