从NSMutableArray获取最后的x个对象
问题描述:
我想抓住数组中的最后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]
但是,范围似乎应该落在界限内,所以我不确定它为什么会给出这个错误。
答
第一个也不应该工作。数组从零开始,因此调用数组的count
方法总是会返回比最后使用的索引多一个的方法。如果您将代码更改为
NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), 4)] mutableCopy];
它应该工作。不过,我不确定为什么第一行确实有效。
答
例如,如果您的数组有10个项目,则count
会将您带到第10个位置。由于这样的数组从第零位开始并延伸到位置9,位置10将超出界限1。
采取一个远离计数,以获得最后的位置:
NSMutableArray *LastLines = [[LogLines subarrayWithRange:NSMakeRange(([LogLines count]-4), [LogLines count]-1)] mutableCopy];
答
您可以使用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)];
}
当我这样做,我得到以下错误: 2013年3月13日15:48:27.112 [ 38764:303] *** - [NSArray subarrayWithRange:]:范围{86699,86702}延伸超出界限[0 .. 86702] 范围似乎可行,但仍然返回超出界限。 – Prognastat 2013-03-13 20:48:50
我想通了。我误解了范围上的第二个值是从第一个值开始的增量值,以下工作: NSMutableArray * LastLines = [[LogLines subarrayWithRange:NSMakeRange(LogLines.count - 5,4)] mutableCopy]; – Prognastat 2013-03-13 21:03:07