有没有办法在 NSDictionary 中获取完全随机的密钥?
NSString *key = [enumeratorForKeysInDictionary nextObject];
我有这个以非随机方式迭代字典的代码。
我应该将所有密钥添加到 NSSet 中,然后从那里随机拉取吗?
有没有更有效的方法来做到这一点?
有没有办法在 NSDictionary 中获取完全随机的密钥?
NSString *key = [enumeratorForKeysInDictionary nextObject];
我有这个以非随机方式迭代字典的代码。
我应该将所有密钥添加到 NSSet 中,然后从那里随机拉取吗?
有没有更有效的方法来做到这一点?
看到这个:
NSArray *array = [dictionary allKeys];
int random = arc4random()%[array count];
NSString *key = [array objectAtIndex:random];
NSArray* allKeys = [dictionary allKeys];
id randomKey = allKeys[arc4random_uniform([allKeys count])];
id randomObject = dictionary[randomKey];
你也可以尝试这样的事情:
NSArray* allKeys = [myDictionary allKeys];
然后可以通过c方法rand()在上面的NSArray中获取随机索引来获取随机key。
这里的想法相同,在键中使用随机索引,但有一些改进:(1) 字典类别,(2) 块枚举器,如本机,(3) 最重要 - 要随机枚举,我们必须消除已经访问过的键. 这将随机访问每个键,恰好一次(除非调用者在块中设置 stop=YES):
//
// NSDictionary+RandBlockEnum.h
//
#import <Foundation/Foundation.h>
@interface NSDictionary (RandBlockEnum)
- (void)enumerateKeysAndObjectsRandomlyUsingBlock:(void (^)(id, id, BOOL *))block;
@end
//
// NSDictionary+RandBlockEnum.m
//
#import "NSDictionary+RandBlockEnum.h"
@implementation NSDictionary (RandBlockEnum)
- (void)enumerateKeysAndObjectsRandomlyUsingBlock:(void (^)(id, id, BOOL *))block {
NSMutableArray *keys = [NSMutableArray arrayWithArray:[self allKeys]];
BOOL stop = NO;;
while (keys.count && !stop) {
id randomKey = keys[arc4random_uniform(keys.count)];
block(randomKey, self[randomKey], &stop);
[keys removeObject:randomKey];
}
}
@end
像这样称呼它:
#import "NSDictionary+RandBlockEnum.h"
NSDictionary *dict = @{ @"k1" : @"o1", @"k2" : @"o2", @"k3" : @"o3" };
[dict enumerateKeysAndObjectsRandomlyUsingBlock:^(id key, id object, BOOL *stop) {
NSLog(@"%@, %@", key, object);
}];
@BestCoder 答案的现代单行版本:
dictionary.allKeys[arc4random_uniform(dictionary.allKeys.count)]
Array(dictionary.keys)[Int(arc4random_uniform(UInt32(dictionary.keys.count)))]
您可以创建一个集合,然后从集合中抓取任何对象。
NSSet *set = [NSSet setWithArray:[myDictionary allKeys]];
NSString *randomKey = [set anyObject];
斯威夫特 4
你有一本字典
let ads = _segueDataFromHomeToGuessMatch_NSType[Constants.Matches.ads] as! NSDictionary
得到一个像这样的随机键值
let rd_ad_key = ads.allKeys[Int(arc4random_uniform(UInt32(ads.count)))] as! String
像这样获取随机键的值
let rd_ad_value = ads[rd_ad_key] as! String