2013-03-13 33 views
7

我想抓住数组中的最后x个对象并将其存储在另一个数组中。从NSMutableArray获取最后的x个对象

喜欢这个工作:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(0, [LogLines count])] mutableCopy]; 

尽管如此,这并不:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count])] mutableCopy]; 

,并在日志中出现以下错误显示出来:

2013年3月13日15:00 :43.475 [38565:303] * - [NSArray subarrayWithRange:]:range {83255,83259} extend bound bound [0 .. 83258]

但是,范围似乎应该落在界限内,所以我不确定它为什么会给出这个错误。

回答

2

第一个也不应该工作。数组从零开始,因此调用数组的count方法总是会返回比最后使用的索引多一个的方法。如果您将代码更改为

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), 4)] mutableCopy]; 

它应该工作。不过,我不确定为什么第一行确实有效。

+0

当我这样做,我得到以下错误: 2013年3月13日15:48:27.112 [ 38764:303] *** - [NSArray subarrayWithRange:]:范围{86699,86702}延伸超出界限[0 .. 86702] 范围似乎可行,但仍然返回超出界限。 – Prognastat 2013-03-13 20:48:50

+0

我想通了。我误解了范围上的第二个值是从第一个值开始的增量值,以下工作: NSMutableArray * LastLines = [[LogLines subarrayWithRange:NSMakeRange(LogLines.count - 5,4)] mutableCopy]; – Prognastat 2013-03-13 21:03:07

0

例如,如果您的数组有10个项目,则count会将您带到第10个位置。由于这样的数组从第零位开始并延伸到位置9,位置10将超出界限1。

采取一个远离计数,以获得最后的位置:

NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count]-1)] mutableCopy]; 
3

您可以使用NSArray -subarrayWithRange:方法,其他的答案表明,如果范围超出了数组数提防(如获得最后的10线,而数组只包含4个元素),它会引发异常!

为了避免这种情况,只需使用if检查数组先算......

NSArray *logs = <some long array> 
int lastLogsCount = 100; 
if (logs.count > lastLogsCount) { // check count first to avoid exception 
    logs = [logs subarrayWithRange:NSMakeRange(logs.count - lastLogsCount, lastLogsCount)]; 
} 
相关问题