3

有没有办法在 NSDictionary 中获取完全随机的密钥?

NSString *key = [enumeratorForKeysInDictionary nextObject]; 

我有这个以非随机方式迭代字典的代码。

我应该将所有密钥添加到 NSSet 中,然后从那里随机拉取吗?

有没有更有效的方法来做到这一点?

4

7 回答 7

6

看到这个:

NSArray *array = [dictionary allKeys];
int random = arc4random()%[array count];
NSString *key = [array objectAtIndex:random];
于 2013-02-12T20:36:05.163 回答
3
NSArray* allKeys = [dictionary allKeys];
id randomKey = allKeys[arc4random_uniform([allKeys count])];
id randomObject = dictionary[randomKey];
于 2013-02-12T20:37:38.723 回答
1

你也可以尝试这样的事情:

NSArray* allKeys = [myDictionary allKeys];

然后可以通过c方法rand()在上面的NSArray中获取随机索引来获取随机key。

于 2013-02-12T20:33:10.943 回答
1

这里的想法相同,在键中使用随机索引,但有一些改进:(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);
}];
于 2013-02-12T21:03:44.960 回答
1

@BestCoder 答案的现代单行版本:

Objective-C

dictionary.allKeys[arc4random_uniform(dictionary.allKeys.count)]

迅速

Array(dictionary.keys)[Int(arc4random_uniform(UInt32(dictionary.keys.count)))]
于 2016-01-22T20:51:29.473 回答
0

您可以创建一个集合,然后从集合中抓取任何对象。

NSSet *set = [NSSet setWithArray:[myDictionary allKeys]];
NSString *randomKey = [set anyObject];
于 2013-02-12T21:06:26.030 回答
0

斯威夫特 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
于 2018-03-03T08:22:30.780 回答