【问题标题】:How does one retrieve a random object from an NSSet instance?如何从 NSSet 实例中检索随机对象?
【发布时间】:2012-04-02 18:33:52
【问题描述】:

我可以通过检索随机索引从类似数组的结构中获取随机值。

如何从存储 NSNumber 对象的 NSSet 对象中获取随机值?我找不到检索随机值的 NSSet 实例方法。

【问题讨论】:

  • 使用[mySet allObjects],它将返回一个数组,然后使用您现有的逻辑来获取随机索引
  • bbum 发现了我在回答中犯的一个大错误,谢谢。已删除。
  • 你想要随机的,还是你不关心哪个?具体来说,我的意思是,“你知道-[NSSet anyObject]吗?”
  • 引用 anyObject 文档:The object returned is chosen at the set’s convenience—the selection is not guaranteed to be random.

标签: objective-c ios


【解决方案1】:

简而言之,您不能直接从NSSet 中检索随机对象。

您要么需要将集合变成一个数组——变成具有可以随机化的索引的东西——通过重新设计你的代码以使用数组,或者你可以使用以下伪代码来实现它:

randomIndex = ...random-generator....(0 .. [set count]);
__block currentIndex = 0;
__block selectedObj = nil;
[set enumerateObjectsWithOptions:^(id obj, BOOL *stop) {
    if (randomIndex == currentIndex) { selectedObj = obj; *stop = YES }
    else currentIndex++;
 }];
 return selectedObj;

是的——它在抓取对象时迭代集合,可能是整个集合。但是,无论如何,该迭代几乎是在转换为 NSArray 时会发生的事情。只要这个系列不是那么大,而且你不经常叫它那么,没什么大不了的。

【讨论】:

  • 这里的总体思路是正确的,但是我需要对其进行调整并实现伪代码才能编译。这是我的版本:gist.github.com/4392708
【解决方案2】:

虽然我喜欢 @bbum 答案会在某些情况下提前终止,因为在枚举块中使用了 stop

为了便于您在以后重新访问此代码时的可读性和容易记住发生的事情,我将采用他的第一个建议 turn the set into an array

NSInteger randomIndex = ..random-generator....(0 .. [set count])
id obj = [set count] > 0 ? [[set allObjects] objectAtIndex:randomIndex] : nil;

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多