如何获取 NSDictionary 中的第一个元素?

Posted

技术标签:

【中文标题】如何获取 NSDictionary 中的第一个元素?【英文标题】:How can I get the first element in an NSDictionary? 【发布时间】:2010-04-22 22:42:45 【问题描述】:

我有一个 NSDictionaries 数组。如何提取字典中的第一个元素?

   NSArray *messages = [[results objectForKey:@"messages"] valueForKey:@"message"];         
    for (NSDictionary *message in messages)
    
        STObject *mySTObject = [[STObject alloc] init];
        mySTObject.stID = [message valueForKey:@"id"];      
        stID = mySTObject.stID;
    

【问题讨论】:

【参考方案1】:

NSDictionary 中没有“第一个”元素;它的成员没有保证的顺序。如果您只想要字典中的 一个 对象,但不关心它与哪个键关联,您可以这样做:

id val = nil;
NSArray *values = [yourDict allValues];

if ([values count] != 0)
    val = [values objectAtIndex:0];

【讨论】:

是的,所以如果[values count] 为零,您仍然可以向val 发送消息而不会崩溃。 请注意allValues 方法返回一个无序数组。根据文档“未定义数组中值的顺序。”。所以你可能得不到你期望得到的对象。 你也可以使用下标。 val = values[0]; 是合法的。更多关于下标的信息:clang.llvm.org/docs/ObjectiveCLiterals.html allValues 不保证订单。【参考方案2】:

NSDictionaries 是无序的,这意味着没有第一个或最后一个元素。事实上,即使在特定字典的生命周期内,也不能保证键的顺序是相同的。

如果你想要任何对象,你可以得到其中一个键:

id key = [[message allKeys] objectAtIndex:0]; // Assumes 'message' is not empty
id object = [message objectForKey:key];

【讨论】:

谢谢 - 这是有道理的。【参考方案3】:

NSArray 有一个名为 firstObject 的选择器,它简化了代码并使其更具可读性:

id val = [[yourDict allValues] firstObject];

如果yourDict 为空val 将是nil,因此无需检查字典/数组大小。

【讨论】:

虽然这是真的,并且可以节省一两行代码,但问题是关于NSDictionary,而不是NSArray 是的,并且是您使用此代码获得的字典的“第一个”值。只是它使用数组转换,就像几乎所有其他答案一样。 字典没有“第一”,因为它没有顺序。每次向字典中添加对象时,您可能会得到不同的“第一”。 当然,字典不是数组,上面没有隐含的顺序。但用户并没有要求数据的特定顺序。【参考方案4】:

最简单的:

[[dict objectEnumerator] nextObject];

【讨论】:

【参考方案5】:

根据Apple,调用allKeysallValues 会产生创建新数组的成本:

一个包含字典值的新数组,或者一个空数组,如果 字典没有条目(只读)

因此,不产生此类费用的替代选项可能如下所示:

NSString* key = nil;
for(key in yourDict)
 // this loop will not execute if the dictionary is empty
   break; // exit loop as soon as we enter it (key will be set to some key)

id object = yourDict[key]; // get object associated with key. nil if key doesn't exist.

注意:如果字典为空,则key保持为nil,返回的对象也为nil,因此我们不需要对字典为空的情况进行特殊处理。

【讨论】:

【参考方案6】:

如果有人仍在寻找此类情况的答案,则可以参考:

// dict 是 NSDictionary

// [dict allKeys] 将给出 dict 中的所有键存在

// [[dict allKeys]objectAtIndex:0] 将从索引 0 处的所有键对象中给出,因为 [dict allKeys] 返回一个数组。

[[dict allKeys]objectAtIndex:0];

【讨论】:

【参考方案7】:

如果您有名为 messageNSDictionary, 这很简单:

message[[[message allKeys] objectAtIndex:0]];

但您必须确定(或更好地检查)您的字典至少包含一个元素。 以下是您可以检查它的方法:

if ([message allKeys] > 0) NSLog(@"%@", message[[[message allKeys] objectAtIndex:0]]);

但是 NSDictionary 没有保证顺序,所以你可能应该只在你的字典只有一个元素时才使用这个代码。

[更新] 如果您需要获取字典的任何元素,使用它也是一个好主意

【讨论】:

【参考方案8】:

试试这个:

NSDictionary *firstValue = [responseObject objectAtIndex:0];

【讨论】:

以上是关于如何获取 NSDictionary 中的第一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

从 NSDictionary 获取 JSON 子元素

使用 NSDictionary 获取特定的 Json 数据

如何在java中获取数组中的第一个和最后一个元素?

用el标签如何获取列表中的第一个元素?

NSDictionary - 需要获取关键子元素的值

如何使用保留关键字访问 NSDictionary 元素?