Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSIndexSet“-指数化指数:“;?_Objective C_Cocoa_Nsindexset - Fatal编程技术网

Objective c NSIndexSet“-指数化指数:“;?

Objective c NSIndexSet“-指数化指数:“;?,objective-c,cocoa,nsindexset,Objective C,Cocoa,Nsindexset,这感觉像是一个愚蠢的问题,因为在我看来,我的用例一定很常见 假设我想用NSIndexSet表示一组稀疏的索引(当然这就是它的用途)。我可以使用 -FieldStindex < /Cord>获得最低的一个和 -LSTindex index 为最高,但是在给定的“索引”下,在中间得到一个任意的任意索引的标准方法是什么?这些文件让我不清楚 例如,如果我有一个包含{0,5,8,10,12,28}的索引集,我想说“给我第四个索引”,我希望得到10(或者12,我想这取决于我是否计算第0个,但我们不要讨论这个

这感觉像是一个愚蠢的问题,因为在我看来,我的用例一定很常见

假设我想用NSIndexSet表示一组稀疏的索引(当然这就是它的用途)。我可以使用<代码> -FieldStindex < /Cord>获得最低的一个和<代码> -LSTindex index <代码>为最高,但是在给定的“索引”下,在中间得到一个任意的任意索引的标准方法是什么?这些文件让我不清楚

例如,如果我有一个包含{0,5,8,10,12,28}的索引集,我想说“给我第四个索引”,我希望得到10(或者12,我想这取决于我是否计算第0个,但我们不要讨论这个,你知道我的意思)

请注意,我没有对整个索引集进行“枚举”。在给定的时间点,我只想知道集合中的第n个索引是多少,按数字顺序排列

也许我的数据结构是错误的(“集合”通常不是为这种有序的访问而设计的),但似乎没有NSIndexArray可谈

我错过了什么明显的东西吗


谢谢

NSIndexSet
不是为这种访问而设计的。通常,通过集合中的索引进行枚举,如下所示:

NSUInteger idx = [theSet indexGreaterThanOrEqualToIndex: 0];
while (idx != NSNotFound) {
    // idx equals the next index in the set.
    idx = [theSet indexGreaterThanIndex: idx];
}
@Richard指出,这一
for
循环更简单:

for (NSUInteger i = [indexSet firstIndex]; i != NSNotFound; i = [indexSet indexGreaterThanIndex:i]) {
    // i equals the next index in the set.
}
从Mac OS X 10.6/iOS 4.0开始,
NSIndexSet
中有一些新的基于块的方法,但到目前为止,我还没有对它们进行回顾


修改上面的示例以保持索引的运行计数,并在到达集合中的第四个索引时停止,这应该很简单

我认为
NSIndexSet
使用范围存储其索引,因此不一定有快速返回
nth
索引的方法。您可以枚举保留计数器,直到计数器达到目标索引:

NSUInteger index = [indexSet firstIndex];

for (NSUInteger i = 0, target = 4; i < target; i++)
  index = [indexSet indexGreaterThanIndex:index];
nsuiger index=[indexSet firstIndex];
for(整数i=0,目标=4;i
这应该给你第四个索引。如果需要,您甚至可以将该方法添加为类别方法:

- (NSUInteger)indexAtIndex:(NSUInteger)anIndex
{
    if (anIndex >= [self count])
      return NSNotFound;

    NSUInteger index = [indexSet firstIndex];
    for (NSUInteger i = 0; i < anIndex; i++)
      index = [self indexGreaterThanIndex:index];
    return index;
}
-(NSUInteger)索引索引:(NSUInteger)索引
{
如果(指数>=[自计数])
返回NSNotFound;
NSU整数索引=[indexSet firstIndex];
对于(整数i=0;i
<>但是,正如你所说的,这可能不是最好的数据结构,所以在这样做之前要考虑更多。

假设我想用NSIndexSet表示一组稀疏的索引(当然这就是它的用途)

[我的重点]

事实上,不是。报告说:

不应使用索引集存储任意整数值集合,因为索引集将索引存储为排序范围

因此,如果您使用它来存储一个稀疏的整数数组,它的效率相当低。另外,获取第n个索引的唯一方法是从一端进行迭代。您最好使用阵列。

还有一个决定:

- (NSUInteger)indexAtIndex:(NSUInteger)index {
   __block NSUInteger result = NSNotFound;
   __block NSUInteger aCounter = 0;

   [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
      if (aCounter == index) {
         result = idx;
         *stop = YES;

      } else {
         aCounter++;
      }
   }];

   return result;
}

也许你可以解决这个问题:@Neilvert:我可能最终会这么做,但是当一个保存索引的数据结构看起来很方便的时候,在NSNumbers中装箱整数似乎有点过头了!:)集合(包括NSIndexSet
)是无序的(或者至少,它们的顺序是未定义的)。因此,
indexateindex:
没有意义,因为这是假设一个有序集(而
NSIndexSet
不是)。@Dave:一般来说,我同意,尽管索引集有点特殊,因为它的内容在语义上是有序的——NSIndexSet公开了
firstIndex
lastIndex
,这是一个让步。(在内部存储范围的实现说明也是如此)。因此,我不觉得
indexateindex:
像我询问一个NSSet那样荒谬。这几乎说明了一切,尽管我会将代码示例编写为for循环:
for(NSUInteger I=[indexSet firstIndex];I!=NSNotFound;I=[indexSet indexGreaterThanIndex:I]){…
,这同样有效。:)事实上,这比我的样品更干净。偷窃!作为提示,如果indexSet为nil,for循环将无限循环,因为它读取:
for(整数i=0;i!=NSNotFound;i=0){}
@KyleRobson您的反对意见对while循环构造同样有效。是的,听起来我没有遗漏什么明显的东西。不幸的是,如果它在内部将索引存储为范围,那么它可以比我在一个类别中更有效地公开IndexateIndex,但这一点值得注意。谢谢,Pshaw,语义!如果我只需要一组已知的连续索引,我会使用NSRange.:)类上的其他方法对我来说是有价值的,但我也希望这种按位置获取的行为,尽管我觉得它不存在。