从Swift中的第二个数组导入

时间:2014-12-24 01:23:40

标签: arrays xcode swift

我有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

            }
        }

谢谢, 安东尼

3 个答案:

答案 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秒到几乎即时。

非常感谢, 安东尼