1

我有一组键/值...

NSArray *keysAndValues = @[@"1", @"one", @"2", @"two", @"3", @"three"];

将其转换为的最简单方法是什么,NSDictionary以便它与看起来像...的字典匹配

NSDictionary *dict = @{@"1" : @"two", @"2" : @"two", @"3" : @"three"};

NSDictionary我的代码只是循环遍历数组并提取键/值,但我想知道是否有更简洁的方法或我缺少的任何内置方法?

4

3 回答 3

3

NSDictionary 中没有内置方法可以从数组中获取备用值并将其分成两组,一组用于键,另一组用于值。

你必须做这样的事情:(这不是编译器测试的,但会给你一个想法。)

如果你想要key = 1并且object = one

for(int i=0;i<keysAndValues.count;i+=2){
    [dict setObject:[keysAndValues objectAtIndex:i+1] forKey:[keysAndValues objectAtIndex:i]];
}
于 2013-01-03T19:45:07.813 回答
3

你没有错过任何东西。除了循环来执行此操作之外,没有任何真正方便的方法。当然,任何解决方案从根本上来说都是循环的,但是如果有一些内置的“过滤”或重新排列能力会很好NSArray(/me 谨慎地咳嗽并查看 Python 列表理解)。

在 GitHub 上vikingosegundo 的 arraytools或其他类似的集合操作扩展中可能有一些有用的东西。编写自己的类别方法来执行此操作当然没有什么坏处,但是,就像我说的那样,那里必须有一个循环。

这是我的建议,不管它值多少钱。通过枚举来拆分数组:

NSMutableArray * keys = [NSMutableArray array];
NSMutableArray * values = [NSMutableArray array];
[array enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop)){
    if( idx % 2 ){
        [values addObject:obj];
    else {
        [keys addObject:obj];
    }
}];

NSDictionary * d = [NSDictionary dictionaryWithObjects:values forKeys:keys];

似乎应该有更好的方法来做到这一点,例如使用NSIndexSetand objectsAtIndexes:,但是没有方便的方法来创建具有非连续索引的索引集。

像这样的东西,例如,会很好:

@implementation NSIndexSet (WSSNonContiguous)


+ (id) WSS_indexSetWithOddIndexesInRange: (NSRange)range
{
    NSMutableIndexSet * s = [NSMutableIndexSet indexSet];

    // If the start of the range is even, start with the next number.
    NSUInteger start = range.location % 2 ? range.location : range.location + 1;
    NSUInteger upper_limit = range.location + range.length;
    for( NSUInteger i = start; i < upper_limit; i += 2 ){
        [s addIndex:i];
    }

    return s;
}

+ (id) WSS_indexSetWithEvenIndexesInRange: (NSRange)range
{
    NSMutableIndexSet * s = [NSMutableIndexSet indexSet];

    // If the start of the range is odd, start with the next number.
    NSUInteger start = range.location % 2 ? range.location + 1 : range.location;
    NSUInteger upper_limit = range.location + range.length;
    for( NSUInteger i = start; i < upper_limit; i += 2 ){
        [s addIndex:i];
    }

    return s;
}

@end

使用辅助功能:

NSRange rangeOfNumbers(NSUInteger start, NSUInteger end)
{
    return (NSRange){start, end-start};
}

这样你就可以做到这一点:

NSIndexSet * s = [NSIndexSet WSS_indexSetWithEvenIndexesInRange:rangeOfNumbers(0, 10)];
NSLog(@"%@", s);
// Prints: <NSMutableIndexSet: 0x7fccca4142a0>[number of indexes: 5 (in 5 ranges), indexes: (0 2 4 6 8)]
于 2013-01-03T20:08:42.670 回答
1

我的代码只是循环遍历数组并提取键/值,但我想知道是否有更简洁的方法或我缺少的任何内置 NSDictionary 方法?

没有出路,你必须遍历所有的数组。

如果您正在寻找一种更清洁的方法,可能 Josh Caswell 的答案是最好的,但您仍然必须遍历数组。

使用这种方法很容易做到:

+ (id)dictionaryWithObjectsAndKeys:(id)firstObject , ... 

但不幸的是,没有直接的方法可以从数组创建 va_list。另请参阅此问题

于 2013-01-03T20:22:27.213 回答