想象一下一个 std:vector,比如说,上面有 100 个东西(0 到 99)。你把它当作一个循环。所以第 105 项是索引 4;从索引 98 向前 7 是 5。您要删除索引位置 P 后的 N 个项目。因此,删除索引 50 之后的 5 个项目;简单的。或索引 99 之后的 5 个项目:当您删除 0 五次或 4 到 0 时,请注意 99 处的位置将被删除。最糟糕的是,索引 97 之后的 5 个项目 - 您必须处理两种删除模式。什么是优雅而可靠的方法?这是我写的一个无聊的例程-(void)knotRemovalHelper:(NSMutableArray*)original after:(NSInteger)nn howManyToDelete:(NSInteger)desired {#define ORCO ((NSInteger)[original count]) static NSInteger kount, howManyUntilLoop, howManyExtraAferLoop; if ( ... our array is NOT a loop ... ) // trivial, if messy... { for ( kount = 1; kount<=desired; ++kount ) { if ( (nn+1) >= ORCO ) return; [original removeObjectAtIndex:( nn+1 )]; } return; } else // our array is a loop // messy, confusing and inelegant. how to improve? // here we go... { howManyUntilLoop = (ORCO-1) - nn; if ( howManyUntilLoop > desired ) { for ( kount = 1; kount<=desired; ++kount ) [original removeObjectAtIndex:( nn+1 )]; return; } howManyExtraAferLoop = desired - howManyUntilLoop; for ( kount = 1; kount<=howManyUntilLoop; ++kount ) [original removeObjectAtIndex:( nn+1 )]; for ( kount = 1; kount<=howManyExtraAferLoop; ++kount ) [original removeObjectAtIndex:0]; return; }#undef ORCO }更新!InVariant 的第二个答案导致了以下出色的解决方案。 “开始于”比“开始于之后”要好得多。所以例程现在使用“开始于”。 Invariant 的第二个答案导致了这个非常简单的解决方案...... N 次,如果 P -(void)removeLoopilyFrom:(NSMutableArray*)ra startingWithThisOne:(NSInteger)removeThisOneFirst howManyToDelete:(NSInteger)countToDelete{// exception if removeThisOneFirst > ra highestIndex// exception if countToDelete is > ra size// so easy thanks to Invariant:for ( do this countToDelete times ) { if ( removeThisOneFirst < [ra count] ) [ra removeObjectAtIndex:removeThisOneFirst]; else [ra removeObjectAtIndex:0]; }}更新!Toolbox 指出了使用新阵列的绝妙想法 - super KISS。 最佳答案 另一种方法:N times do {remove entry at index P mod max(ArraySize, P)}例子:N=5, P=97, ArraySize=1001: max(100, 97)=100 so remove at 97%100 = 972: max(99, 97)=99 so remove at 97%99 = 97 // array size is now 993: max(98, 97)=98 so remove at 97%98 = 974: max(97, 97)=97 so remove at 97%97 = 05: max(96, 97)=97 so remove at 97%97 = 0关于iphone - 小心地从 "circular" vector (或者可能只是一个 NSMutableArray)中删除 N 个项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4678507/
10-15 06:21